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

ofApp.h

#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);
};

ofApp.cpp

#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

C#の場合

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;
	}
}

JavaScriptの場合

#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倍にしています。

Post a comment

※承認されるまではコメントは表示されません。

Trackbacks

URL: http://b.i-tach.com/wp-trackback.php?p=835