2005 年 10 月 04 日 : 253倍のスピードアップ
従来、組込みソフトがC++言語でプログラミングされることはほとんどなかった。何故ならCPUスピードやメモリ容量などのハードウェア的な制約があるからだ。しかしPCのソフトはどうだろうか?限りなく多くの人々が利用する製品レベルのソフトほどC++言語でプログラミングされている。
例えば、Javaシステムの核ともいえるJavaVMもC++言語で実装されているものが多い。Macromedia社の著名なあるソフトでもクラッシュ直後にC++のエラーメッセージが表示されるのを目撃したりする。
昨日、ソフィア・クレイドルが発表したSophiaFrameworkという製品は、組込みソフトが実用レベルでC++プログラミングできるという革新に最大の特長がある。試験的に速度の向上を計測したところ、下記レポートにあるように最大253倍のスピードアップが確認された。
飛行機の発明のおかげで人々は世界の大空を自由に駆け巡れるようになった。同じく、ハードウェア制約の厳しい組込みの世界で桁違いのスピードアップを狙うのならば何らかの抜本的なブレークスルーが必要である。前回のリリースからこの1年半以上に渡る期間というものは、ひたすらこのイノベーションに捧げられたといっても過言ではない。
スタッフの計測実験レポート。
---------------------------------------------------------------------------
SophiaFramework3.0の新旧の性能比較は以下の通りです。
文字列はどのアプリケーションでも多用される基本的なオブジェクトです。新バージョンのSophiaFrameworkでは文字列処理にかかるコストが大幅に削減されました。文字列以外のオブジェクトももちろん最適化されています。例えば、コレクションクラスなどは構造自体が変化しているので、単純な比較はできません。ここでは文字列クラスを取りあげ、どの程度速度が向上しているかを示します。
■例1:文字列の追加
void func1() {
int i, j, sum;
SFXAnsiString str; // 旧バージョンではSFUAnsiString
sum = 0;
for (i = 0; i < 10; i++) { // 10回計測
int startms = GETTIMEMS(); //計測開始
for (j = 0; j < 1000; j++) { // 1000回実行
str += "abcdef"; //文字列の追加(今までの文字列に"abcdef"を追加)
}
int endms = GETTIMEMS(); //計測終了
DBGPRINTF("%d", endms - startms);
sum += endms - startms;
}
DBGPRINTF("avarage = %d", sum / 10);
}
計測された時間(単位は ms)
旧バージョン 2.2
246
691
1161
1698
2269
2802
3348
3849
4364
4909
average = 2533
新バージョン 3.0
10
11
10
10
10
10
10
11
10
10
average = 10
解説
文字列 str に繰り返し "abcdef" 文字列 を追加していく動作です。
例えば、ネットワーク通信で受信した文字列を今ある文字列に次々に追加していく場合、このようなコードが出てきます。
SophiaFramework 旧バージョンでは文字列の追加のたびに新しいインスタンスを生成したため、大幅な時間のロスとなっていました。新バージョンではこのようなロスをなくし、時間短縮がなされています。
■例2:文字列の検索
void func2() {
int i, j, sum, temp;
SFXAnsiString str; // 旧バージョンではSFUAnsiString
sum = 0;
for (i = 0; i < 10000; i++) { // 文字列の準備(abcabc... と続く文字列を用意し、途中に"SophiaFramework3.0"の文字列を挿入したものを用意する)
if (i == 5000) str += "SophiaFramework3.0";
else str += "abc";
}
for (i = 0; i < 3; i++) { // 3回計測
int startms = GETTIMEMS(); //計測開始
for (j = 0; j < 100; j++) { // 100回実行
temp += str.IndexOf("SophiaFramework3.0"); //文字列の検索(何文字目にあるか)
}
int endms = GETTIMEMS(); //計測終了
DBGPRINTF("%d %d", endms - startms, temp);
sum += endms - startms;
}
DBGPRINTF("avarage = %d", sum / 3);
}
計測された時間(単位は ms)
旧バージョン 2.2
7019
6998
7008
average = 7008
新バージョン 3.0
1281
1299
1280
average = 1286
解説
長い文字列から"SophiaFramework3.0"の文字列が何番目にあるかを探しています。
こちらも効率化により時間が短縮されています。
■例3:文字列の置き換え
void func3() {
int i, j, sum;
SFUAnsiString str; // 旧バージョンではSFUAnsiString
SFUAnsiString temp_str;
sum = 0;
for (i = 0; i < 10000; i++) { // 文字列の準備
if (i == 5000) str += "SophiaFramework2.2";
else str += "abc";
}
for (i = 0; i < 3; i++) { // 3回計測
int startms = GETTIMEMS(); //計測開始
for (j = 0; j < 10; j++) { // 10回実行
temp_str = str.Replace("SophiaFramework2.2", "SophiaFramework3.0"); //文字列の置換
}
int endms = GETTIMEMS(); //計測終了
DBGPRINTF("%d %d", endms - startms, temp_str.Length());
sum += endms - startms;
}
DBGPRINTF("avarage = %d", sum / 3);
}
計測された時間(単位は ms)
旧バージョン 2.2
3741
3741
3724
average = 3735
新バージョン 3.0
626
626
626
average = 626
解説
長い文字列から"SophiaFramework2.2"の文字列を見つけ出し、"SophiaFramework3.0"に置換しています。
以上