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




