Numbersは、表からのデータ取得は高速なのに表にデータを設定するのが1000倍以上遅いという特徴を持っています。Numbersの表にデータを連続設定するのが、ある意味現行環境で一番重いAppleScriptのベンチマークと言われてしまうほどに。
そんな中、「ignoring application responses」句で囲って、非同期コマンド実行を行うと、Numbersでも100倍ぐらいの高速化が図れます。AppleScriptの処理系はすぐに解放されますが、Numbers側でコマンドをバッファリングして処理を継続します。
速くなりすぎなので、どこかに副作用があるのでは? と、かなり懐疑的な目で見ていましたが、どうやら危ないポイントが見えてきました。
5×5000セルを連続値で埋める、というテストを「ignoring application responses」つきで行なっていたところ、2万2000を超えたあたりでNumbersの表にデータが書き込まれなくなっていました。
▲10x 5,000のセルを選択して、連続値で埋める処理を非同期モードで実行した結果。この処理では、31,717まで実行したところで終わった
AppleEventのコマンドのバッファリングをアプリ側で行なっているような挙動だったのですが、このバッファに一定の上限があるという仮説を立てています。
ちょっとした処理を行うだけではこの「上限」に達することはないものと思われますが、Numbersに対してセルに値を連続かつ大量に設定するような場合には気をつけてください。
実施環境は、Numbers v14.2+macOS 15.2beta+MacBook Air M2(RAM 16GB)です。
AppleScript名:選択中のセルをシーケンシャル値で埋める(ベンチマーク用).scpt |
use AppleScript use scripting additions use framework "Foundation" script spd property aList : {} end script set a1Dat to current application’s NSDate’s timeIntervalSinceReferenceDate() set sNum to 1 tell application "Numbers" tell front document tell active sheet tell table 1 set (aList of spd) to cell of selection range set iCount to 0 set newList to {} repeat with i in (aList of spd) set the end of newList to sNum + iCount ignoring application responses set value of i to sNum end ignoring set sNum to sNum + 1 end repeat end tell end tell end tell end tell set b1Dat to current application’s NSDate’s timeIntervalSinceReferenceDate() set c1Dat to (b1Dat – a1Dat) |
More from my site
(Visited 1 times, 1 visits today)