Stukje applescript code mega traag onder Leopard
12 februari 2008 - 02:10   
geplaatst door: BeNoOne
Geachte,

Ik heb een applescriptje geschreven wat onder Tiger prima draait. Nu heb ik al enige tijd Leopard draaien en draait het applescript mega traag. Het werkt nog zoals geadverteerd maar het duurt nu tot wel 25 minuten voor dat hij klaar is, waar het onder Tiger luttele seconden waren. Processor gebruik is ook erg hoog.

Nu heb ik het stukje code getraceerd waar het probleem in zit.


-->Schoon het HTML zooitje op
on remove_markup()
       set copy_flag to true
       set the clean_text to ""
       repeat with this_char in theContents
       set this_char to the contents of this_char
       if this_char is "<" then
                       set the copy_flag to false
               else if this_char is "&" then
                       set the copy_flag to false
               else if this_char is ">" then
                       set the copy_flag to true
               else if the copy_flag is true then
                       set the clean_text to the clean_text & this_char as string
               end if
       end repeat
       set AlleItemsSchoon to the paragraphs of clean_text
       return AlleItemsSchoon
end remove_markup

Redelijk simpel stukje code wat een HTML file ontdoet van voor mij niet relevante tekens.

Zijn er meer mensen die gelijke problemen hebben, of is mijn amateur geprogrammeer echt zo slecht?
Zo ja voor het eerste, hebben jullie dit kunnen oplossen?
Zo ja voor het tweede, valt mijn code nog te redden zodat hij als nog weer op normale snelheid kan draaien?

Grtzzz,

BeNoOne

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 10:09    reactie #1
geplaatst door: marksch
Hi Benoone,

Het is me niet geheel duidelijk wat je in theContents hebt staan. Als dat gewoon text is, zou het volgende iets sneller moeten zijn:

on remove_markup(theContents)
set the clean_text to ""
repeat with this_char in theContents
if this_char is not in "<&>" then
set the clean_text to the clean_text & this_char
end if
end repeat
return clean_text
end remove_markup

Groet,

Mark

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 17:17    reactie #2
geplaatst door: BeNoOne
Dank voor de reactie. Helaas gaat deze code voor mij niet werken. Het is namelijk de bedoeling dat de karakters "<" "&" ">" en alle tekst daar tussen verwijderd wordt. Nu worden alleen deze karakters verwijderd.

Maar ik heb jou code even getest en ook hier geldt dat het onder Tiger als een speer door loopt en onder Leopard niet. Ik ben bang dat ik toch bij Apple aan moet kloppen.

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 17:25    reactie #3
geplaatst door: marksch
Benoone,

Hoe voer je jouw code precies uit? Is je script onderdeel van iets groters?

Mijn script doet inderdaad iets anders dan het jouwe, zie ik nu. Toch kan jouw script wel enigszins geoptimaliseerd worden door < and & samen te nemen in 1 if-statement.

Mark

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 18:14    reactie #4
geplaatst door: BeNoOne
Idd wat het totale programma doet is een HTML file ophalen met rooster gegevens en deze gegevens weer in iCal zetten. Om de gegevens uit deze file te filteren haal ik eerst alle HTML code er uit, dit is de taak van deze routine.

Maar optimalisatie heeft totaal geen zin. Ik bedoel een paar tiende van een seconde op 20 minuten zet geen zode aan de dijk. Er lijkt iets fundamenteels mis met applescript onder Leopard. Onder Tiger is het totale programma in een paar seconden volledig afgerond. Onder Leopard duurt het toch al gauw 20 minuten dit heeft niets meer met een beetje optimaliseren te maken.

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 18:31    reactie #5
geplaatst door: bert
Niet dat ik een oplossing heb, maar ben je bekend met de site http://macscripter.net?

Bert

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 18:39    reactie #6
geplaatst door: bert
Heb je ook geprobeerd wat variantjes te maken of door
-- outcommenting
te kijken welke regel nu eigenlijk het probleem vormt?

Bijvoorbeeld: Als je hier
-- set the clean_text to the clean_text & this_char as string
twee streepjes voorzet en het script loopt weer als een speer, dan is dat het probleem.
Zo zijn er meer regels die je kunt testen. Ook al doet het script dan niet wat je wilt, je komt er wel achter waar het probleem zit. In plaats van de repeat kun je een andere repeat nemen. Gewoon, lengte van de string bepalen en dan ander type lus gebruiken.

Ber

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 18:43    reactie #7
geplaatst door: hitchhiker
Ik vermoed dat de kneep 'm in dit gedeelte zit:

set the clean_text to the clean_text & this_char as string
Hoe langer de tekst in clean_text wordt hoe langer het duurt om er een karakter aan toe te voegen. Het kan dus zin hebben om de tekst eerst te verzamelen in een buffer en die periodiek te legen in clean_text. Zodoende zou je de tijd tot een kwart of een tiende terug kunnen brengen, het blijft dus een workaround en tijd om een bugmelding te doen. :nervous:
Stukje applescript code mega traag onder Leopard
12 februari 2008 - 18:45    reactie #8
geplaatst door: BeNoOne
http://macscripter.net ken ik idd en heb al eens wat zoek pogingen of wat gewaagt, maar nog niets gevonden.

Ik heb het stukje code van marksch ook geprobeerd en hier hetzelfde effect. Ik zal idd nog in mijn eigen code wat outcommenten. T'is wel vreemd moet ik zeggen.

@ hitchhiker
Mijn programmeer kennis gaat nu ook weer niet zover dat ik weet hoe ik het eerst in een buffer kan zetten. Maar ik ben bang dat je wel gelijk hebt dat het in deze regel fout gaat. Ik ga ff kijken of ik zonder deze regel iets zinnigs kan testen.

(Bewerkt door BeNoOne om 18:52, 12-02-2008)

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 19:17    reactie #9
geplaatst door: hitchhiker
Er zijn meerdere wegen die naar Rome leiden, dit is er een.


on remove_markup()
      set copy_flag to true
      set the clean_text to ""
      set clean_buffer to ""
      repeat with this_char in theContents
      set this_char to the contents of this_char
      if this_char is "<" then
                      set the copy_flag to false
              else if this_char is "&" then
                      set the copy_flag to false
              else if this_char is ">" then
                      set the copy_flag to true
                      set the clean_text to the clean_text & the clean_buffer
                      set clean_buffer to ""
              else if the copy_flag is true then
                      set the clean_buffer to the clean_buffer & this_char as string
              end if
      end repeat
      set the clean_text to the clean_text & the clean_buffer
      set AlleItemsSchoon to the paragraphs of clean_text
      return AlleItemsSchoon
end remove_markup

Ik heb niks getest, er zal dus nog wel wat fout gaan. :tounge:

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 19:22    reactie #10
geplaatst door: marksch
Benoone,


Citaat
BeNoOne om 18:14, 12-02-2008
Idd wat het totale programma doet is een HTML file ophalen met rooster gegevens en deze gegevens weer in iCal zetten. Om de gegevens uit deze file te filteren haal ik eerst alle HTML code er uit, dit is de taak van deze routine.

Maar optimalisatie heeft totaal geen zin. Ik bedoel een paar tiende van een seconde op 20 minuten zet geen zode aan de dijk. Er lijkt iets fundamenteels mis met applescript onder Leopard. Onder Tiger is het totale programma in een paar seconden volledig afgerond. Onder Leopard duurt het toch al gauw 20 minuten dit heeft niets meer met een beetje optimaliseren te maken.

Waarom denk je dat dit gedeelte van het programma er de oorzaak van is dat de uitvoering van het programma zo lang duurt?

Meestal doet AppleScript er erg lang over om uit te vinden waar een bepaalt component of benodigd programma zich bevindt, als het die component of dat programma niet kan vinden op de verwachte locatie. Is het mogelijk dat de upgrade naar Leopard het pad naar een benodigd component heeft veranderd?

Mark

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 19:40    reactie #11
geplaatst door: BeNoOne
Ik heb de code volledig "naakt" uitgeprobeerd. Dus alleen dit stukje code doet er 20 minuten over om te runnen.

Zelfs jou code heb ik tot de core terug gebracht.


set theContents to read (choose file)
-->Schoon het HTML zooitje op
set the clean_text to ""
repeat with this_char in theContents
       if this_char is not in "<&>" then
               set the clean_text to the clean_text & this_char
       end if
end repeat
return clean_text

Dit doet er al 20 minuten over om af te ronden onder Leopard. Onder Tiger in seconden. Ik zie hier echt geen componenten die gezocht moeten worden.

(Bewerkt door BeNoOne om 19:43, 12-02-2008)

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 19:49    reactie #12
geplaatst door: BeNoOne
@ hitchhiker
Oké ik heb jou aanpassing nu geïsoleerd gestart om 19:45 uur. Ff timen of het merkbaar sneller gaat.

....
....

Oké 9 minuten later is hij klaar. Ik had de file een beetje kleiner gemaakt zodat ik niet te lang hoef te wachten. Om 19:56 heb ik mijn eigen routine gestart. Teller loopt.

....
....

Fotofinish allebei ongeveer 9 minuten.

Toch maar eens met Apple contact zoeken. Het maakt overigens niet uit of ik op PPC draai of intel.

(Bewerkt door BeNoOne om 20:09, 12-02-2008)

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 20:10    reactie #13
geplaatst door: bert
OK, als je een structurele oplossing wil (maar je zult daar wel op moeten wachten), bezoek dan de feedback pagina van Apple (http://www.apple.com/feedback/macosx.html/) en beschrijf daar je probleem. Plak de code erbij (en vervang het NL commentaar door Engels).

Vertel (rustig en beleefd) dat het onder Tiger in seconden gaat en onder Leopard in minuten.

Met vriendelijke groeten,

Bert

Voorbeeldtekst:
I use AppleScript to process a text to remove all HTML tags using AppleScript. My script ran under Tiger in seconds. With Leopard it takes about 20 minutes for the average text to be processed. I have trimmed down the script  to isolate the problem. You will be able to use the script below to verify the problem under Leopard. A fix is highly appreciated. Thanks.

-- select an HTML file
[rest van je script]

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 20:31    reactie #14
geplaatst door: BeNoOne
Thnx bert (mmm, het is nu net of ik mijzelf antwoord ;-) ) voor de uitgebreide uitleg. Die link had ik idd al eens eerder gekregen en dat bedoelde ik ook met contact zoeken. Maar ben idd bang dat dat wel even kan duren.
Stukje applescript code mega traag onder Leopard
12 februari 2008 - 21:00    reactie #15
geplaatst door: BeNoOne
Oké feedback verstuurd.

Maar dat schiet niet echt op, ik heb nog steeds geen antwoord. :wink:

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 21:07    reactie #16
geplaatst door: bert
LOL 10.5.2 is net uit, dus maximale wachttijd.

Tsja, het is niet gezegd dat ze het repareren (maar ik heb al weet ik niet hoevaak gehad dat iets dat ik meldde uiteindelijk gefixt werd). Aangezien je het probleem zo goed geanalyseerd hebt, kunnen ze het gemakkelijk reproduceren en de bug gemakkelijk fixen. Goede feedback geven helpt.

Trouwens, als je de regel
-- set the clean_text to the clean_text & this_char
outcomment, is het script dan wel snel (ik wil zeker weten dat het niet de repeat is).

Bert

Stukje applescript code mega traag onder Leopard
12 februari 2008 - 22:13    reactie #17
geplaatst door: BeNoOne
Ach ik ben er nu toch al aan gewend om te wachten tot het script klaar is, dan kan er wel een maandje of wat bij. :dozingoff:

-- set the clean_text to the clean_text & this_char
Heb ik idd er even uitgehaald geen resultaat.

Ook heb ik deze er uitgehaald.
-- set this_char to the contents of this_char

Zelfde resultaat.

(Bewerkt door BeNoOne om 22:14, 12-02-2008)