TweetFollow Us on Twitter

AS Performance
Volume Number:12
Issue Number:5
Column Tag:Applescript

Improving AppleScript Performance

Avoiding the AppleSloth blues

By Mark Alldritt

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

Why Is AppleScript So Slow, Anyway?

This is the question our customers ask most frequently, and one to which there is no simple answer. The reason given by Apple is that the Apple event mechanism used by AppleScript to communicate with other applications has serious performance limitations under System 7. In my tests, there clearly are limits to the number of round-trip Apple events you can push through the system per second. However, there’s something else wrong, apparently, because even AppleScript scripts which don’t generate any Apple events do not seem to perform as well as similar scripts written in Frontier.

This article provides a number of tips for improving the performance of your scripts. Depending on the kind of scripts you are working on, these improvements in performance may turn out to be dramatic.

Improving Compile Time Performance

Regardless of what script editor you are using, you are bound to get to the point where you wish scripts would compile faster. Here are some tips for keeping compile times as short as possible:

Buy Speed Doubler if you are using a PowerPC-based Macintosh. My customers have reported a 2 to 4 times improvement in AppleScript performance with Speed Doubler installed.

Keep the number of scripting additions to a minimum. Having too many scripting additions slows AppleScript’s load time, since it must process that many more files in the Scripting Additions folder. Also, more scripting additions means more event and class names must be parsed from 'aete' resources and added to the AppleScript symbol table.

A side benefit of keeping the number of scripting additions to a minimum is that you are less likely to run into terminology conflicts. This happens when a term is defined by two different scripting additions.

Split up your scripting projects. Use the load script command to load pre-compiled portions of your script project. If you’re using Script Editor, Script Wizard, FaceSpan or Scripter, it’s probably best to store your pre-compiled scripts in a known location so that you can use simple Load Script statements:

property lib1 : load script alias "My HD:Script Libraries:Lib1"

Alternatively, you can store your libraries in the same folder as your script editor, and load them with the following command:

property lib1 : load script "Lib1"

If you’re using Script Debugger, you can use its path to me handling to store your libraries in a folder with your script:

property projectPath :¬
 «property ctnr» of item (path to me) of ¬
 application "Finder" as string
property lib1 : load script (projectPath & "Lib1")

Once you’ve loaded your library, you can access properties and call handlers stored within it like this:

propertyName of lib1

handlerName(p1, p2, p3) of lib1

Don’t overdo AppleScript formatting. The formatted text feature of AppleScript is the only really good way to understand how AppleScript has interpreted your script during compilation. Unfortunately, the more formats you use, the slower your compiles will be. The slowdown is caused when your script editor is forced to cope with growing numbers of style runs as it displays your script following a compile. The answer is to keep the number of formats you use to a minimum.

This point becomes more important as the size of your scripts grow. For short scripts, it’s not really an issue, but for scripts larger than about 100K it can represent as much as a couple of minutes of the total compile time. A PowerPC-native script editor helps here (Script Debugger, Script Wizard), but it’s always going to be an issue.

Keep background activity to a minimum. All the script editors allow some level of background activity during compiles. If you keep this to a minimum, your compiles will be faster. Avoid having the Finder perform folder size calculations, turn off personal file sharing, etc. If you’re using Scripter, turn off its “allow background compiles” preferences option. This speeds compiles dramatically.

Improving Run Time Performance

Probably the most frustrating part of using AppleScript is watching its seemingly slow progress through your script. Here are some tips and ideas for making scripts run faster.

Install Speed Doubler if you are on a PowerPC.
See above.

Keep the number of Apple events your script generates to a minimum. Under System 7, Apple event performance is poor. A System 7 application can process at most 60 events per second, with typical performance more like 20-40 events per second. Reducing the number of Apple events will significantly speed up your script.

The most common mistake is to iterate over application objects using AppleScript. Instead, use “whose” clauses to get the server application to do the iteration for you. (Note: not all scriptable applications support this - complain to the developers and let them know you want full support for the “object model”.)

The slow way:

tell application "Finder"
 repeat with aItem in (items of first window)
 if name of aItem ends with ".temp" then
 delete aItem
 end
 end
end

The fast way:

tell application "Finder"
 delete (items whose name ends with ".temp") ¬
 of first window
end

The next error people commonly make is to repeatedly ask for the value of properties. For example, you might do the following:

tell application "Finder"
 repeat with aItem in items of window 1
 if name of aItem ends with ".c" or ¬
 name of aItem ends with ".h" then
 -- do something with .c and .h files
 end
 end
end

This script fragment gets the value of the application’s name property twice. A faster method is to get the name property once:

tell application "Finder"
 repeat with aItem in items of window 1
 set theFileName to name of aItem
 if theFileName ends with ".c" or ¬
 theFileName ends with ".h" then
 -- do something with .c and .h files
 end
 end
end

Avoid using AppleScript’s object-oriented features. AppleScript supports object-oriented programming to a great extent. I’ve found that handler calls within object instances tend to be slow (the first handler call is the worst). Use these features only if they are justified.

Use properties to store pre-compiled values. If there are values which are calculated once at the beginning of your script, consider putting these calculations into property definitions. By doing this, you cause the calculations to be performed at compile time rather than run time.

This technique can be particularly dramatic if you are using scripting additions to help with the calculations, since the Apple events used to invoke the scripting additions are generated at compile time.

Use scripting additions. Use scripting additions for complex list and text manipulation. The ACME Script Widgets and other collections of scripting additions offer tools for text parsing, tokenization, list manipulation and other functions. It’s almost always going to be faster to use a scripting addition rather than an AppleScript loop to work with these data structures.

Execute scripting addition commands within your applet’s process. As stated above, Apple events sent to other processes for handling are slow (20-60 events/sec); but events processed within the script applet are handled much faster, since they are dispatched without involving interprocess communications and process context switches.

So, in the following example, the current date command (which is a scripting addition command) is executed within the Scriptable Text Editor’s process rather than the applet:

tell application "Scriptable Text Editor"
 make new line at end of first window ¬
 with data (current date as string)
end

An improvement in speed would result if you did it this way:

set theData to current date as string
tell application "Scriptable Text Editor"
 make new line at end of first window ¬
 with data theData
end

If you are deep within a tell block, you could deal with the problem this way:

tell application "Scriptable Text Editor"
 ...
 make new paragraph at end of first window with ¬
 data ((current date) of me as string)
 ...
end

Use the right tool for the job. Sometimes you can get dramatic speed improvements by switching tools. For example, if you’re doing text manipulation, consider using MacPerl, or BBEdit, or a special-purpose scripting addition. If you have several tools available, try using each of them to perform time-consuming parts of your script. See which one is best suited and performs best.

Use the right object accessing method. The Object Model is a powerful thing, and offers great flexibility for the script writer. The problem is that it allows you to easily create object specifications that can be very difficult for the server application to resolve.

You can sometimes improve performance greatly by changing the way you access objects. For example, text editors generally maintain internal data structures to help them identify the beginning of lines. As a result, line-based object specifications are resolved much faster than word- or paragraph-based specifiers, because the application can use the data it already has to speed things up.

Try using different ways of forming your object specifiers and see which ones are fastest.

Code time-consuming logic in OSAXen. As a last resort, you can code time-consuming portions of your script as a scripting addition. MacTech Magazine 10.1 featured an article on just this subject, and you can look at it online at http://web.xplain.com/mactech.com/Articles/Vol.10/10.01/
Extend-Applescript.bhtml. Documentation on writing scripting additions can also be found in Apple’s AppleScript Scripting Additions Guide.

The Final Frontier

The applets (standalone AppleScript applications) produced by Script Editor, Script Debugger, Script Wizard and Scripter all rely on the standard applet glue code provided by Apple. This glue code provides a framework in which your script executes. The standard glue code attempts to be a really good MacOS citizen. To this end, it yields the CPU to other processes very frequently. One way to improve the performance of your scripts is to write your own glue code, and yield the CPU less frequently, or possibly not at all. This change, depending on the frequency of yields, can cause speed improvements of up to 25%.

The Future

The future of AppleScript is quite bright. Following a period of almost non-existent support from Apple, there is to be a new version (1.2) released sometime this year. This new version will be PowerPC-native, and is expected to offer performance comparable to that of Frontier. Beyond the 1.2 release, there’s Copland. There is reason to expect that under Copland, the AppleEvent Manager will offer dramatic performance improvements; supposedly, Apple events will be dispatched directly to your handlers, not to your app’s event loop, thereby removing a serious speed bottleneck. And, there are rumours of a completely re-architected post-Copland AppleScript 2.0. In the meantime, AppleScript continues to prove its worth, and the techniques in this article should help you see some script speed improvements now.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

OmniGraffle 7.2.2 - Create diagrams, flo...
OmniGraffle helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use Graffle to... Read more
OmniGraffle Pro 7.2.2 - Create diagrams,...
OmniGraffle Pro helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use... Read more
OmniGraffle Pro 7.2.2 - Create diagrams,...
OmniGraffle Pro helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use... Read more
OmniGraffle 7.2.2 - Create diagrams, flo...
OmniGraffle helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use Graffle to... Read more
Spotify 1.0.44.100. - Stream music, crea...
Spotify is a streaming music service that gives you on-demand access to millions of songs. Whether you like driving rock, silky R&B, or grandiose classical music, Spotify's massive catalogue puts... Read more
Microsoft OneNote 15.29 - Free digital n...
OneNote is your very own digital notebook. With OneNote, you can capture that flash of genius, that moment of inspiration, or that list of errands that's too important to forget. Whether you're at... Read more
WALTR 2 2.0.8 - $39.95
WALTR 2 helps you wirelessly drag-and-drop any music, ringtones, videos, PDF, and ePub files onto your iPhone, iPad, or iPod without iTunes. It is the second major version of Softorino's critically-... Read more
Dropbox 16.3.27 - Cloud backup and synch...
Dropbox is an application that creates a special Finder folder that automatically syncs online and between your computers. It allows you to both backup files and keep them up-to-date between systems... Read more
EtreCheck 3.1.5 - For troubleshooting yo...
EtreCheck is an app that displays the important details of your system configuration and allow you to copy that information to the Clipboard. It is meant to be used with Apple Support Communities to... Read more
Carbon Copy Cloner 4.1.12 - Easy-to-use...
Carbon Copy Cloner backups are better than ordinary backups. Suppose the unthinkable happens while you're under deadline to finish a project: your Mac is unresponsive and all you hear is an ominous,... Read more

Latest Forum Discussions

See All

Track Santa with these three festive app...
Christmas is fast approaching and that means it's time to prepare for Santa's yearly pilgrimage around the globe. Christmas Eve is an exciting time as parents help their kids get ready to welcome Santa. You've got the cookies and milk all planned... | Read more »
Galaxy on Fire 3 and four other fantasti...
Galaxy on Fire 3 - Manticore brings the series back for another round of daring space battles. It's familiar territory for folks who are familiar with the franchise. If you've beaten the game and are looking to broaden your horizons, might we... | Read more »
The best apps for your holiday gift exch...
What's that, you say? You still haven't started your holiday shopping? Don't beat yourself up over it -- a lot of people have been putting it off, too. It's become easier and easier to procrastinate gift shopping thanks to a number of apps that... | Read more »
Toca Hair Salon 3 (Education)
Toca Hair Salon 3 1.0 Device: iOS Universal Category: Education Price: $2.99, Version: 1.0 (iTunes) Description: | Read more »
Winter comes to Darkwood as Seekers Note...
MyTona, based in the chilly Siberian city of Yakutsk, has brought a little festive fun to its hidden object game Seekers Notes: Hidden Mystery. The Christmas update introduces some new inhabitants to players, and with them a chance to win plenty of... | Read more »
Bully: Anniversary Edition (Games)
Bully: Anniversary Edition 1.03.1 Device: iOS Universal Category: Games Price: $6.99, Version: 1.03.1 (iTunes) Description: *** PLEASE NOTE: This game is officially supported on the following devices: iPhone 5 and newer, iPod Touch... | Read more »
PINE GROVE (Games)
PINE GROVE 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: A pine grove where there are no footsteps of people due to continuous missing cases. The case is still unsolved and nothing has... | Read more »
Niantic teases new Pokémon announcement...
After rumors started swirling yesterday, it turns out there is an official Pokémon GO update on its way. We’ll find out what’s in store for us and our growing Pokémon collections tomorrow during the Starbucks event, but Niantic will be revealing... | Read more »
3 reasons why Nicki Minaj: The Empire is...
Nicki Minaj is as business-savvy as she is musically talented and she’s proved that by launching her own game. Designed by Glu, purveyors of other fine celebrity games like cult favorite Kim Kardashian: Hollywood, Nicki Minaj: The Empire launched... | Read more »
Clash of Clans is getting its own animat...
Riding on its unending wave of fame and success, Clash of Clans is getting an animated web series based on its Clash-A-Rama animated shorts.As opposed to the current shorts' 60 second run time, the new and improved Clash-A-Rama will be comprised of... | Read more »

Price Scanner via MacPrices.net

New 2016 13-inch Touch Bar MacBook Pros on sa...
B&H Photo the new 2016 Apple 13″ 2.9GHz/256GB Touch Bar MacBook Pros on sale for $50 off MSRP, each including free shipping plus NY sales tax only: - 13″ 2.9GHz/256GB Touch Bar MacBook Pro Space... Read more
12-inch 1.2GHz Space Gray Retina MacBook on s...
B&H Photo has dropped their price on the 2016 Apple 12″ 1.2GHz Space Gray Retina MacBook (MLH82LL/A) to $1399 including free shipping plus NY sales tax only. Their price is $200 off MSRP, and it’... Read more
Never Settle for Low Performing Wifi With iOS...
AppYogi Software has announced the release of WiFi Signal Strength Status App 1.0, the company’s new utility developed exclusively for macOS. WiFi Signal Strength Status App features a unique, single... Read more
New 2016 13-inch Touch Bar MacBook Pros in st...
B&H Photo has stock of new 2016 Apple 13″ Touch Bar MacBook Pro models, each including free shipping plus NY sales tax only: - 13″ 2.9GHz/512GB Touch Bar MacBook Pro Space Gray: $1999 - 13″ 2.... Read more
New 2016 15″ Touch Bar MacBook Pros in stock...
B&H Photo has new 2016 Apple 15″ Touch Bar MacBook Pro models in stock today including free shipping plus NY sales tax only: - 15″ 2.7GHz Touch Bar MacBook Pro Space Gray: $2799 - 15″ 2.7GHz... Read more
DietSensor App Targeting Diabetes and Obesity...
DietSensor, Inc., a developer of smart food and nutrition applications designed to fight diabetes and obesity and help improve overall fitness, has announced the launch of its DietSensor app for... Read more
Holiday 2016 13-inch 2.0GHz MacBook Pro sales...
B&H has the non-Touch Bar 13″ MacBook Pros in stock today for $50-$100 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 13″ 2.0GHz MacBook Pro Space Gray (MLL42LL/A): $1449 $... Read more
Holiday sale: Apple TVs for $51-$40 off MSRP,...
Best Buy has dropped their price on the 64GB Apple TV to $159.99 including free shipping. That’s $40 off MSRP. 32GB Apple TVs are on sale right now for $98 on Sams Club’s online store. That’s $51 off... Read more
12-inch Retina MacBooks, Apple refurbished, n...
Apple has restocked a full line of Certified Refurbished 2016 12″ Retina MacBooks, now available for $200-$260 off MSRP. Refurbished 2015 models are available starting at $929. Apple will include a... Read more
Holiday sale: 12-inch Retina MacBook for $100...
B&H has 12″ Retina MacBooks on sale for $100 off MSRP as part of their Holiday sale. Shipping is free, and B&H charges NY sales tax only: - 12″ 1.1GHz Space Gray Retina MacBook: $1199 $100... Read more

Jobs Board

Integration Technician, *Apple* - Zones, In...
…at Zones and for our customers each day. Position Overview The Apple Integration Technician will be responsible for performing customer specific configuration Read more
*Apple* Brand Ambassador (Macy's) - The...
…(T-ROC), is proud of its unprecedented relationship with our partner and client, APPLE ,in bringing amazing" APPLE ADVOCATES"to "non" Apple store locations. Read more
*Apple* Retail - Multiple Positions- Trumbul...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
US- *Apple* Store Leader Program - Apple (Un...
…Summary Learn and grow as you explore the art of leadership at the Apple Store. You'll master our retail business inside and out through training, hands-on Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.