Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion Groups
General
GeneralPortable MacsHardwareNetworking
Applications
Mac ApplicationsEudoraFirefox / MozillaInternet ExplorerOutlook ExpressMS OfficeEntourageExcelPowerPointWordVirtual PCMedia PlayerOther MS Products
Programming
Mac ProgrammingCodeWarriorPerl
Country Specific
Australian Mac GroupUK Mac Group

Mac Forum / Programming / Perl / June 2006



Tip: Looking for answers? Try searching our database.

AppleScript Interface

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Thane Norton - 15 Jun 2006 01:18 GMT
Up until now, I have done all of my perl->AppleScript interfacing  
using osascript. I am planning on writing an script that does a lot  
of Scripting in OmniGraffle, and was wondering if anyone has any  
experience with the CPAN AppleScript packages that are available.  
Specifically I am looking at Mac::AppleScript or  
MacPerl::AppleScript.  Thoughts?
-----------------------------------------
Thane Norton
Claes Jakobsson - 15 Jun 2006 09:11 GMT
Hi,

> Up until now, I have done all of my perl->AppleScript interfacing  
> using osascript. I am planning on writing an script that does a lot  
> of Scripting in OmniGraffle, and was wondering if anyone has any  
> experience with the CPAN AppleScript packages that are available.  
> Specifically I am looking at Mac::AppleScript or  
> MacPerl::AppleScript.  Thoughts?

There is Mac::Glue on CPAN (http://search.cpan.org/~cnandor/Mac-
Glue-1.25/) for doing AppleEvents stuff (like AS does) but with a  
Perlish interface. I haven't used it personally but it sure looks nice.

Cheers,
Claes
Chris Nandor - 17 Jun 2006 17:51 GMT
> Up until now, I have done all of my perl->AppleScript interfacing  
> using osascript. I am planning on writing an script that does a lot  
> of Scripting in OmniGraffle, and was wondering if anyone has any  
> experience with the CPAN AppleScript packages that are available.  
> Specifically I am looking at Mac::AppleScript or  
> MacPerl::AppleScript.  Thoughts?

The two are about the same.  The differences are primarily that (I think)
Mac::AppleScript is not really supported any longer, because it was written
before Mac::Carbon was ported to Mac OS X (and is now included in Mac OS X,
as of Tiger), and it's a bit slower.

There's also the Mac::OSA::Simple::applescript() function, which calls the
OSA functions directly, and is about as fast as MacPerl::DoAppleScript.

Of course, osascript is *far* slower than both.  Of course, this is not
because osascript itself is slow, but because perl has to call out to the
shell.  Plus, osascript is harder to use than the others, since you have to
do all that escaping.

The non-osascript methods are all good though; MacPerl::DoAppleScript() is
just preferred because it is already included in Tiger and it's the fastest
of the four methods.

Here's some benchmarking I did a little while ago, and I just reran the
Benchmark in Tiger and it's basicaly the same.

  http://www.nntp.perl.org/group/perl.macperl/2938

Also, as noted, there's Mac::Glue, which is usually a bit slower than
calling AppleScript functions directly, but can be faster in some cases,
too, by being able to do looping and other things Perl does better, in Perl.  
Mac::Glue calls the Apple event API directly.

But, of course, its main feature is that you can write Perl instead of
AppleScript.

Finally, the Mac::OSA::Simple method allows you to compile scripts and
execute them, thereby giving you the best possible performance.  (You can
also compile a script that can accept variables, for those cases where you
need to call the same script many times but with different values passed to
it, by setting up handlers.)

So those are the main issues, to my mind: ease/style of use, availability,
and performance.  Here's an update on the benchmarks, which test only raw
performance of getting the value of a property.

  #!/usr/bin/perl
  use strict;
  use warnings;

  use Benchmark qw(timethese cmpthese);
  use Mac::AppleScript 'RunAppleScript';
  use MacPerl 'DoAppleScript';
  use Mac::OSA::Simple qw(applescript compile_applescript);
  use Mac::Glue;

  my $finder = new Mac::Glue 'Finder';
  # cache name property object so we don't need to recreate it every time
  my $prop = $finder->prop(name => of => 'startup disk');

  my $script = 'tell application "Finder" to get name of startup disk';
  my $compiled = compile_applescript($script);

  my %tests = (
    applescpt  => sub { applescript($script)         },
    applescptc => sub { $compiled->execute           },
    doscript   => sub { DoAppleScript($script)       },
    runscript  => sub { RunAppleScript($script)      },
    glue       => sub { $finder->prop(name => of => 'startup disk')->get },
    gluec      => sub { $prop->get                   },
    osascript  => sub { `osascript -ss -e '$script'` }
  );

  my $results = timethese(500, \%tests);
  cmpthese($results);

Benchmark: timing 500 iterations of applescpt, applescptc, doscript, glue,
gluec, osascript, runscript...
applescpt:  3 wallclock secs ( 1.40 usr +  0.38 sys =  1.78 CPU) @ 280.90/s
(n=500)
applescptc:  1 wallclock secs ( 0.40 usr +  0.04 sys =  0.44 CPU) @
1136.36/s (n=500)
 doscript:  3 wallclock secs ( 1.01 usr +  0.36 sys =  1.37 CPU) @ 364.96/s
(n=500)
     glue:  7 wallclock secs ( 2.89 usr +  1.12 sys =  4.01 CPU) @ 124.69/s
(n=500)
    gluec:  7 wallclock secs ( 2.39 usr +  1.09 sys =  3.48 CPU) @ 143.68/s
(n=500)
osascript: 281 wallclock secs ( 0.13 usr  3.31 sys + 96.68 cusr 53.40 csys
= 153.52 CPU) @ 145.35/s (n=500)
runscript: 27 wallclock secs ( 8.15 usr +  6.58 sys = 14.73 CPU) @ 33.94/s
(n=500)
            Rate runscript   glue gluec osascript applescpt doscript
applescptc
runscript  33.9/s        --   -73%  -76%      -77%      -88%     -91%      
-97%
glue        125/s      267%     --  -13%      -14%      -56%     -66%      
-89%
gluec       144/s      323%    15%    --       -1%      -49%     -61%      
-87%
osascript   145/s      328%    17%    1%        --      -48%     -60%      
-87%
applescpt   281/s      728%   125%   96%       93%        --     -23%      
-75%
doscript    365/s      975%   193%  154%      151%       30%       --      
-68%
applescptc 1136/s     3248%   811%  691%      682%      305%     211%        
--

(Note: much of Mac::Carbon, and Mac::Glue, does not work yet on Intel; my
port should be done in a week.)

Hope that helps,

Signature

Chris Nandor                      pudge@pobox.com    http://pudge.net/
Open Source Technology Group       pudge@ostg.com     http://ostg.com/

 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.