スクリプト処理速度比較「VBS・JS・Python・C++」

先日Softimageのスクリプトの事で調べ物をしていたら、Softimageのスクリプト言語での処理速度を比較するという面白い記事を見つけました。(myaraさんのサイト、他のスクリプト記事も濃くて面白いです^^)

今までスクリプトの処理速度は気にした事が無かったので「VBS、意外と速いんやなぁ〜」と興味深く読んでました。ただこの2年間くらいはPython縛りでプラグイン作成を統一していた自分にとっては、Pythonの速度比較が気になるところです。という訳で、今回は上記記事を参考にSoftimageのスクリプト言語での速度比較をしてみました。

はじめに

題材にしたのは、上記記事にあったXSIBaseのスクリプト。処理の内容はというと、

・選択しているポリゴンオブジェクトを取得
・ポリゴンオブジェクトのエッジを取得
・全てのエッジを検証。エッジに隣接しているポリゴン(neighbor polygon)が2つ以上あるか判定
・2つ以上あれば、各ポリゴンの法線ベクトルを取得
・2つのポリゴンの法線ベクトルの差が、指定した値以上であればエッジを選択

というような感じです。今回の速度計測で使用したオブジェクトは、恒例のスタンフォードドラゴンをリダクションしたものを利用しています。(そのままだと処理時間がかかりすぎたので…。)

まずはこれをmyaraさんの記事に基づいて最適化したものをベースで利用しています。最適化の概要は「option explicitを利用した宣言の徹底」と「特定のエッジを発見した時に、その都度選択を行う処理を止め、一旦配列に保存して最後に一括選択」が大きなところです。このスクリプトで、処理時間的には下記の通りとなりました。


スクリプト 処理時間(秒)
VBScript 593.6172
VBScript(最適化) 7.1118

確かに速くなりました。しかもかなり!書き方でこんなに変わるものなんですね。

スクリプト毎の比較

さて、上記で最適化したVBスクリプトを他の言語にも移植していきます。今回はJスクリプトPython、あとC++でdll化したものも用意してみました。どれも処理内容は同じものです。で、結果はこちら。


スクリプト 処理時間(秒)
VBScript 7.1118
JScript 8.7450
Python 100.1579
C++ 1.8930

Python遅いっ!圧倒的に処理時間がかかっています。これはどういうことなんでしょう…。処理の流れは同じはずなんですが…。
そういえばC++で作ったdllはプラグイン形式で、他の言語はスクリプトの直接実行なので、その辺りが影響しているのかなと思い、他の言語もプラグイン化してみました。

そして結果はこちら。


スクリプト 処理時間(秒)
VBScript 7.1118 (秒)
VBScript(Plugin化) 6.8593 (秒)
JScript 8.7450 (秒)
JScript(Plugin化) 8.5820 (秒)
Python 100.1579 (秒)
Python(Plugin化) 99.3639 (秒)
C++ 1.8930 (秒)

うぅん速くなっているようですが、体感速度的には誤差程度の差しか無かったですね・・・。(マクロ的な使い方をしていれば、体感的に速くなる印象があるので、今回みたいなエッジをforでループと言う処理内容では結果が出にくいのかもしれません。)

まとめ

というわけで、今回の比較ではPythonが遅くて、VBスクリプトが速いという結果になりました。

最近は時流に乗ってプラグイン制作では全てPythonで統一を考えていましたが、VBスクリプトを見直しました。よくよく考えるとSoftimage自体に入っているプラグイン自体の大半がVBスクリプトで書かれているので、そこで気づくべきでしたね。

Pythonの構文はシンプルで行数も少なく、アーティストには優しい言語だと思っているので、今後も使用を継続していくと思いますが、処理速度を求めるところはVBスクリプトで書くという選択肢は考えた方が良いかもですね。

あと最後に、今回使ったスクリプトC++のソースはダウンロードできる形にしています。もし「Pythonはこう書いたら速くなるよ〜。」とかヒントがあれば、ぜひコメントいただければと思います。自分もその方が助かるので…。

VBS_JS_PY_CPP.zip 直

では!