前提 §
ANGF+ISSGの自動テストが、デスクトップとBlazorで60倍ぐらいの速度差があって非現実的と分かってきたので、本当にBlazorは遅いのか簡単なベンチを取ってみることにしました。
数値は全て自分のPCでの実行結果です。(Releaseビルド。BlazorはChromeで実行)
検証1・数値計算 §
private static int ext1 = 12;
private static int ext2 = 34;
private static int ext3 = 56;
private static int ext4 = 78;
private static int testNum()
{
int sum = 0;
for (int i = 0; i < 100000000; i++)
{
sum += i + ext1 - ext2 * ext3 / ext4;
sum += (int)(Math.Sin((double)(i/100))*100);
}
return 0;
}
- Console 00:00:02.9548852
- Blazor 00:00:35.9780000
ざっと計算すると約12ですが、有効桁数は多くないので、大ざっぱに丸めて10倍遅いという結論で良いと思います。
検証2・文字列 §
private static int testString()
{
string s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int i = 0; i < 80000000; i++)
{
string t = s[0].ToString();
s = s.Substring(1);
s = s + t;
}
return s.Length;
}
- Console 00:00:04.3968952
- Blazor Error: Garbage collector could not allocate 16384u bytes of memory for major heap section.
例外でギブアップしたので、比較は成立せず。ちなみに文字列の長さは26と25を往復し続けるだけでメモリを大量に使うことはないはずです。しかし、例外が起きるまでの時間を体感で比較しても、【とてつもなく遅い】と言えます。
検証3・sin抜き数値計算 §
private static int testNum2()
{
int sum = 0;
for (int i = 0; i < 1000000000; i++)
{
sum += i + ext1 - ext2 * ext3 / ext4;
}
return sum;
}
- Console 00:00:04.0124808
- Blazor 00:04:14.2760000
ほぼ基礎体力の比較。
まあ大ざっぱに言って60倍。
ANGF+ISSGの自動テストが60倍遅かったという根拠はこのあたりに求められそうです。複雑な文字の加工もしないし、ほとんど実数の関数演算もしません。
結論 §
Blazorは遅いです。どの機能が遅いというわけではなく、基礎的な実行能力が遅いと思われます。ほとんどの時間が入力待ちであるようなプログラムなら良いですが、処理時間が長い用途にはまだ向かないと思われます。
1980年頃の状況で言えば、下手をするとマシン語とBASICインタプリタぐらいの速度差です。しかし、BASICインタプリタで書かれた優れたプログラムはいくらでもあったので、Blazorも使い方次第でいくらでも使い物になると思われます。
以上!
オマケ §
検証3はEdge Devだと00:03:17.1430000となってChromeより速かった。(でも焼け石に水)