俺イケ!!!

俺よりイケてないエンジニアはいない

GASの処理速度が遅いと評判なので計測してみた

GAS

先日、GASでいつものようにコードを組んでいたのですが、どうも処理が追いつかずサーバ側のタイムアウトが発生する事案に遭遇。

以下の記事にもあるように、GASはAPIをコールしまくると途端に処理速度が低下するのはよくある話で、今回のコードも何の考えもなしにループの終了条件でgetLastRow()を設定していた。
[GAS][スプレッドシート]処理速> 度を向上するには: 逆引きGoogle Apps Script

いつもならバグ見つかってよかったー、で終わってしまうのですがちょっと気になることがあったので検証してみました。

【検証】GASの処理が遅いって言われてるけど、実際どうなの?

ということで今回はよくやりそうな処理のサンプルを作ってみたので実測値を見てみる。

[検証1]for文にgetLastRow()を突っ込んだ場合の処理遅延

以下のコードを実行してみる。

	function speedCheck1() {
	  var ss = SpreadsheetApp.openById(SS_KEY).getActiveSheet();  
	  var counter = ss.getLastRow();
  
 	 Logger.log('speed check start:getLastRow()');
 	 for(var i = 0;i < ss.getLastRow();i++){}
 	 Logger.log('speed check end:getLastRow()->count:'+i);

	  Logger.log('speed check start:counter');
 	 for(var i = 0;i < counter;i++){}
	  Logger.log('speed check end:counter->count:'+i);
	}	

結果は以下。

	[13-10-24 00:31:46:496 JST] speed check start:getLastRow()
	[13-10-24 00:31:54:044 JST] speed check end:getLastRow()->count:100
	[13-10-24 00:31:54:045 JST] speed check start:counter
	[13-10-24 00:31:54:045 JST] speed check end:counter->count:100

[検証2]ループ内でスプレッドシートの値をgetValue()しちゃった場合の処理遅延

次はこちらのコード。

	function speedCheck2() {
	  var ss = SpreadsheetApp.openById(SS_KEY).getActiveSheet();
	  var array = ss.getDataRange().getValues();
	  var counter = ss.getLastRow();
	  var result = new Array();
  
	  Logger.log('speed check start:getValue()');
	  for(var i = 0;i < counter;i++){
 	   result[i] = ss.getRange(i+1,1).getValue();
	  }
 	  Logger.log('speed check end:getValue()->count:'+i);

 	  Logger.log('speed check start:assignment');
 	  for(var i = 0;i < counter;i++){
	    result[i] = array[i][0];
 	  }
 	  Logger.log('speed check end:assignment->count:'+i);
	}

結果

結果はご覧の通り。

	[13-10-24 00:36:15:285 JST] speed check start:getLastRow()
	[13-10-24 00:36:22:977 JST] speed check end:getLastRow()->count:100
	[13-10-24 00:36:22:977 JST] speed check start:counter
	[13-10-24 00:36:22:978 JST] speed check end:counter->count:100

整理すると

[検証1] 7452ms  
[検証2] 7692ms  

という結果でした。メソッドによって1call当たりの処理速度は当然ながら変わってくると思いますので参考程度に 見てもらえればと思います。
しかしながら100回callしただけで7秒以上の差が出ているのは驚きなので、複雑な処理になっている時ほど処理を改善すると効果絶大です。 処理速度にお悩みでしたらコード内にこういった処理が潜んでいるかもしれません。

22 Oct 2013 #blog