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.

 
AAPL
$100.96
Apple Inc.
-0.83
MSFT
$47.52
Microsoft Corpora
+0.84
GOOG
$596.08
Google Inc.
+6.81

MacTech Search:
Community Search:

Software Updates via MacUpdate

Audio Hijack Pro 2.11.3 - Record and enh...
Audio Hijack Pro drastically changes the way you use audio on your computer, giving you the freedom to listen to audio when you want and how you want. Record and enhance any audio with Audio Hijack... Read more
Airfoil 4.8.9 - Send audio from any app...
Airfoil allows you to send any audio to AirPort Express units, Apple TVs, and even other Macs and PCs, all in sync! It's your audio - everywhere. With Airfoil you can take audio from any... Read more
WhatRoute 1.13.0 - Geographically trace...
WhatRoute is designed to find the names of all the routers an IP packet passes through on its way from your Mac to a destination host. It also measures the round-trip time from your Mac to the... Read more
Chromium 37.0.2062.122 - Fast and stable...
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all Internet users to experience the web. FreeSMUG-Free OpenSource Mac User Group build is... Read more
Attachment Tamer 3.1.14b9 - Take control...
Attachment Tamer gives you control over attachment handling in Apple Mail. It fixes the most annoying Apple Mail flaws, ensures compatibility with other email software, and allows you to set up how... Read more
Duplicate Annihilator 5.0 - Find and del...
Duplicate Annihilator takes on the time-consuming task of comparing the images in your iPhoto library using effective algorithms to make sure that no duplicate escapes. Duplicate Annihilator detects... Read more
jAlbum Pro 12.2 - Organize your digital...
jAlbum Pro has all the features you love in jAlbum, but comes with a commercial license. With jAlbum, you can create gorgeous custom photo galleries for the Web without writing a line of code!... Read more
jAlbum 12.2 - Create custom photo galler...
With jAlbum, you can create gorgeous custom photo galleries for the Web without writing a line of code! Beginner-friendly, with pro results Simply drag and drop photos into groups, choose a design... Read more
Quicken 2015 2.0.4 - Complete personal f...
Quicken 2015 helps you manage all your personal finances in one place, so you can see where you're spending and where you can save. Quicken automatically categorizes your financial transactions,... Read more
iMazing 1.0 - Complete iOS device manage...
iMazing (formerly DiskAid) is the ultimate iOS device manager with capabilities far beyond what iTunes offers. With iMazing and your iOS device (iPhone, iPad, or iPod), you can: Copy music to and... Read more

Latest Forum Discussions

See All

View Source – HTML, JavaScript and CSS...
View Source – HTML, JavaScript and CSS 1.0 Device: iOS Universal Category: Utilities Price: $.99, Version: 1.0 (iTunes) Description: View Source is an app plus an iOS 8 Safari extension that makes it easy to do one key web developer... | Read more »
Avenged Sevenfold’s Hail To The King: De...
Avenged Sevenfold’s Hail To The King: Deathbat is Coming to iOS on October 16th Posted by Jessica Fisher on September 19th, 2014 [ permalink ] Just in time for Halloween, on October 16 Avenged Sevenfold will be launching | Read more »
Talisman Has Gone Universal – Can Now be...
Talisman Has Gone Universal – Can Now be Played on the iPhone Posted by Jessica Fisher on September 19th, 2014 [ permalink ] | Read more »
Tap Army Review
Tap Army Review By Jennifer Allen on September 19th, 2014 Our Rating: :: SHOOT EM ALLUniversal App - Designed for iPhone and iPad Mindless but fun, Tap Army is a lane-based shooter that should help you relieve some stress.   | Read more »
Monsters! Volcanoes! Loot! Epic Island f...
Monsters! Volcanoes! Loot! | Read more »
Plunder Pirates: Tips, Tricks, Strategie...
Ahoy There, Seadogs: Interested in knowing our thoughts on all this plundering and pirating? Check out our Plunder Pirates Review! Have you just downloaded the rather enjoyable pirate-em-up Plunder Pirates and are in need of some assistance? Never... | Read more »
Goat Simulator Review
Goat Simulator Review By Lee Hamlet on September 19th, 2014 Our Rating: :: THE GRUFFEST OF BILLY GOATSUniversal App - Designed for iPhone and iPad Unleash chaos as a grumpy goat in this humorous but short-lived casual game.   | Read more »
A New and Improved Wunderlist is Here fo...
A New and Improved Wunderlist is Here for iOS 8 Posted by Jessica Fisher on September 19th, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Evernote Update for iOS 8 Adds Web Clipp...
Evernote Update for iOS 8 Adds Web Clipping, Quick Notes, and More Posted by Ellis Spice on September 19th, 2014 [ permalink ] | Read more »
Apple Names Ultimate Productivity Bundl...
Apple Names Ultimate Productivity Bundle by Readdle as the Essential Bundle on the App Store Posted by Jessica Fisher on September 19th, 2014 [ permalink | Read more »

Price Scanner via MacPrices.net

iFixIt Tears Down iPhone 6; Awards Respectabl...
iFixit notes that even the smaller 4.7″ iPhone 6 is a giant among iPhones; so big that Apple couldn’t fit it into the familiar iPhone form factor. In a welcome reversal of a recent trend to more or... Read more
Phone 6 Guide – Tips Book For Both iPhone 6...
iOS Guides has announced its latest eBook: iPhone 6 Guide. Brought to you by the expert team at iOS Guides, and written by best-selling technology author Tom Rudderham, iPhone 6 Guide is packed with... Read more
How to Upgrade iPhone iPad to iOS 8 without D...
PhoneClean, a iPhone cleaner utility offered by iMobie Inc., reveals a solution for upgrading iPhone and iPad to iOS 8 without deleting photos, apps, the new U2 album or anything. Thanks to more than... Read more
Inpaint 6 – Photo Retouching Tool Gets Faster...
TeoreX has announced Inpaint 6, a simple retouching tool for end users that helps remove scratches, watermarks, and timestamps as well as more complex objects like strangers, unwanted elements and... Read more
Worldwide PC Monitor Market Sees Growth in To...
Worldwide PC monitor shipments totaled 32.5 million units in the second quarter of 2014 (2Q14), a year-over-year decline of -2.9%, according to the International Data Corporation (IDC) Worldwide... Read more
Updated Price Trackers
We’ve updated our Mac Price Trackers with the latest information on prices, bundles, and availability on systems from Apple’s authorized internet/catalog resellers: - 15″ MacBook Pros - 13″ MacBook... Read more
Mac Pros available for up to $260 off MSRP
Adorama has Mac Pros on sale for up to $260 off MSRP. Shipping is free, and Adorama charges sales tax in NY & NJ only: - 4-core Mac Pro: $2839.99, $160 off MSRP - 6-core Mac Pro: $3739.99, $260... Read more
13-inch 2.6GHz/256GB Retina MacBook Pros avai...
B&H Photo has the 13″ 2.6GHz/256GB Retina MacBook Pro on sale for $1379 including free shipping plus NY sales tax only. Their price is $120 off MSRP. Read more
Previous-generation 15-inch 2.0GHz Retina Mac...
B&H Photo has leftover previous-generation 15″ 2.0GHz Retina MacBook Pros now available for $1599 including free shipping plus NY sales tax only. Their price is $400 off original MSRP. B&H... Read more
21″ 2.7GHz iMac available for $1179, save $12...
Adorama has 21″ 2.7GHz Hawell iMacs on sale for $1179.99 including free shipping. Their price is $120 off MSRP. NY and NJ sales tax only. Read more

Jobs Board

*Apple* Retail - Multiple Positions (US) - A...
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
Position Opening at *Apple* - Apple (United...
**Job Summary** At the Apple Store, you connect business professionals and entrepreneurs with the tools they need in order to put Apple solutions to work in their Read more
Position Opening at *Apple* - Apple (United...
**Job Summary** The Apple Store is a retail environment like no other - uniquely focused on delivering amazing customer experiences. As an Expert, you introduce people Read more
Position Opening at *Apple* - Apple (United...
**Job Summary** As businesses discover the power of Apple computers and mobile devices, it's your job - as a Solutions Engineer - to show them how to introduce these Read more
Position Opening at *Apple* - Apple (United...
…Summary** As a Specialist, you help create the energy and excitement around Apple products, providing the right solutions and getting products into customers' hands. You Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.