Flash・Unity・openFrameworksの計算速度比較
普段使うツールで計算速度が速いのはどれっていうのは、頭の中でなんとなく序列ができていますが、実際の数値でどれくらい差があるんだろうと思い、各ツールに似たような計算をさせて計算時間を計ってみました。
試してみたのは下記のツールです。
・openFrameworks(C++)
・Unity(C#)
・Unity(JavaScript)
・Flash(ActionScript3)
・Webブラウザ(JavaScript)
実行したコードは後述しますが、主には配列へのアクセスと関数の実行を1億回行ったという内容です。
一番差が出る部分と思う描画関係のコードは一切なく、あくまで配列と関数の速度ですので「へ~」くらいに思いながら参考にしていただければと思います。
実行環境は全て同じPCで統一しています。
[実行環境]
・OS: Windows 8.1
・プロセッサ: Core i7-4500U
結果は以下のようになりました。
計算時間 (ミリ秒) |
ツール | 言語 | 内容 |
---|---|---|---|
158 | openFrameworks | C++ | v0.8.3 exe |
244 | Unity | C# | v4.3.5 PCスタンドアローン |
497 | Unity | JavaScript | v4.3.5 PCスタンドアローン |
845 | Flash | ActionScript3 | FlashPlayer13.0 スタンドアローン |
2096 | Webブラウザ | JavaScript | Chrome v36.0 |
Unityって、「C#」と「JavaScript」で速度が違ったんですね。初めて知りました。
後、テストしてみて一番驚いたのはWebブラウザでのJavaScript実行の速さです。
ツールごとの順番では一番遅くなっていますが、Webブラウザ用JavaScriptだけは配列の初期設定時にlengthの指定をしていません。
FlashのActionScript3でVectorのlength指定を省略すると計算時間が5000ミリ秒になってしまったこと考えると、Webブラウザ用JavaScriptは思っていたよりかなり早かったです。
かといってWebブラウザ用JavaScriptで配列の初期設定時にlengthの指定をすると8000ミリ秒かかってしまい逆に遅くってしまったので、ケースバイケースということでお願いします。(なにが)
以下、ツール別の内容です。
■openFrameworks
#pragma once #include "ofMain.h" #define MAX_NUM 100000000 class ofApp : public ofBaseApp{ private: int time1; int time2; int arr[MAX_NUM]; int testFunc(int i); public: void setup(); void draw(); void keyReleased(int key); };
#include "ofApp.h" void ofApp::setup(){ time1 = 0; time2 = 0; } void ofApp::draw(){ if(time2 != 0){ ofDrawBitmapString(ofToString(time2), 20, 20); } } void ofApp::keyReleased(int key){ time1 = ofGetElapsedTimeMillis(); for(int i = 0; i < MAX_NUM; i++) { arr[i] = testFunc(i); arr[i] = arr[i] + 1; } time2 = ofGetElapsedTimeMillis() - time1; } int ofApp::testFunc(int i){ return i; }
計算時間 (ミリ秒) |
ツール | ver | 言語 | 内容 |
---|---|---|---|---|
158 | openFrameworks | 0.8.3 | C++ | exe |
162 | openFrameworks | 0.8.3 | C++ | Visual Studio Express 2012 ローカルWindowsデバッガー(Releaseモード) |
2721 | openFrameworks | 0.8.3 | C++ | Visual Studio Express 2012 ローカルWindowsデバッガー(Debugモード) |
計算時間は毎回同じ数値が出る訳ではなく、158の場合もあれば260の場合もあったりで結構誤差があるので、ざっくりで見てもらえればと思います。
■Unity
using UnityEngine; using System.Collections; public class IndexC : MonoBehaviour { private int time1 = 0; private int time2 = 0; private const int maxNum = 100000000; private int[] arr = new int[maxNum]; void Update () { if (Input.GetKeyUp(KeyCode.Space)){ time1 = (int) (Time.realtimeSinceStartup*1000); for (int i = 0; i < maxNum; i++){ arr[i] = testFunc(i); arr[i] = arr[i] + 1; } time2 = (int)(Time.realtimeSinceStartup * 1000) - time1; } } void OnGUI(){ if (time2 != 0){ GUI.Label(new Rect(0, 0, 100, 30), time2.ToString()); } } int testFunc(int i){ return i; } }
#pragma strict private var time1:int = 0; private var time2:int = 0; private var maxNum:int = 100000000; private var arr:int[] = new int[maxNum]; function Update() { if (Input.GetKeyUp(KeyCode.Space)){ time1 = Time.realtimeSinceStartup*1000; for (var i:int = 0; i < maxNum; i++){ arr[i] = testFunc(i); arr[i] = arr[i] + 1; } time2 = Time.realtimeSinceStartup*1000 - time1; } } function OnGUI() { if (time2 != 0){ GUI.Label(new Rect(0, 0, 100, 30), time2.ToString()); } } function testFunc(i:int):int { return i; }
計算時間 (ミリ秒) |
ツール | ver | 言語 | 内容 |
---|---|---|---|---|
244 | Unity | 4.3.5 | C# | PCスタンドアローン |
260 | Unity | 4.3.5 | C# | WebPlayer htmlをFireFox v31.0で再生 |
497 | Unity | 4.3.5 | JavaScript | PCスタンドアローン |
531 | Unity | 4.3.5 | JavaScript | WebPlayer htmlをFireFox v31.0で表示 |
1311 | Unity | 4.3.5 | C# | Gameパネル |
1468 | Unity | 4.3.5 | JavaScript | Gameパネル |
■Flash
package myproject{ import flash.display.MovieClip import flash.events.MouseEvent; import flash.text.TextField; public class Index extends MovieClip { public var maxNum:int = 100000000; public var arr:Vector.= new Vector. (maxNum, true); public function Index() { stage.addEventListener(MouseEvent.CLICK,clickHandler); } private function clickHandler(e:MouseEvent):void { var time1:Number = new Date().time; for (var i:int = 0; i < maxNum; i++) { arr[i] = testFunc(i); arr[i] = arr[i] + 1; } var time2:Number = new Date().time-time1; var tf:TextField = new TextField(); addChild(tf); tf.text = String(time2); } public function testFunc(i:int):int { return i; } } }
計算時間 (ミリ秒) |
ツール | ver | 言語 | 内容 |
---|---|---|---|---|
845 | Flash | CC2014 | AS3 | FlashPlayer13.0 スタンドアローン |
1044 | AIR | 14.0 | AS3 | AIRランタイム デスクトップ版 |
4350 | Flash | CC2014 | AS3 | FlashPlayer14.0 htmlをFireFox v31.0で表示 |
4063 | Flash | CC2014 | AS3 | プレビュー |
5060 | AIR | 14.0 | AS3 | FlashDevelop 4.6.2 AIR 14.0 テスト再生 リリースモード |
27292 | AIR | 14.0 | AS3 | FlashDevelop 4.6.2 AIR 14.0 テスト再生 デバッグモード |
FlashDevelopのAIR テスト再生(デバッグモード)の圧倒的な遅さが気になったのですが、原因がよく分かっていません。
■Webブラウザ
<html> <head> <script language="Javascript" type="text/javascript"> var maxNum = 100000000; var arr = []; function clickHandler(){ var time1 = new Date(); for (var i = 0; i < maxNum; i++) { arr[i] = testFunc(i); arr[i] = arr[i] + 1; } var time2 = new Date()-time1; document.getElementById("timePane").innerHTML=time2; } function testFunc(i){ return i; } </script> </head> <body> <a href="javascript:clickHandler();">button</a> <div id="timePane"></div> </body> </html>
計算時間 (ミリ秒) |
ツール | 言語 | 内容 |
---|---|---|---|
2096 | Webブラウザ | JavaScript | Chrome v36.0 |
2184 | Webブラウザ | JavaScript | IE v11.0 |
4576 | Webブラウザ | JavaScript | FireFox v31.0 |
IEが以外と早いです。
※どのブラウザでもループの回数は1億回で試すとタイムオーバーか何かで処理が止まってしまっていたので、タイムオーバーにならない5千万回で出た計算時間を2倍にしています。