Windows7 64ビット版
Erlang OTP R15B(x64)
CPU AMD PhenomII X4 905e 2.5GHz
メモリ 12GB
という環境で、erl.exeにて実行。10回の計測を実施、単位は秒。
1万プロセス | 10万プロセス | |||
暗号なし | 暗号あり | 暗号なし | 暗号あり | |
平均 | 0.304 | 0.278 | 38.286 | 40.150 |
最大 | 0.499 | 0.500 | 104.365 | 117.983 |
最小 | 0.156 | 0.156 | 10.452 | 10.936 |
でした。割とばらつくのはWindows上のVMだからでしょうか。1万プロセス〜10万プロセスぐらいだと最大も最小もほぼ変わらないですね。cryptoへ一気に流し込んでも、それほど処理の影響はなさそうです。
そもそもcryptoの処理自体が(全体と比して)軽そうです。
crypto処理ありのベンチマークテストコード。
-module(cryptobench).
-import(lists, [foreach/2]).
-compile(export_all).
start(A) ->
crypto:start(),
E = encrypt_text("Hello World!"),
L = lists:seq(1, A, 1),
SendBackPid = self(),
StartTime = erlang:now(),
lists:map(fun(X) -> spawn(fun() -> sendback(SendBackPid, X, E) end) end ,L),
loop([], A),
EndTime = erlang:now(),
Diff = timer:now_diff( EndTime, StartTime ),
io:format("elapsed time: ~p (sec)~n", [ Diff / 1000000 ]),
crypto:stop().
loop(State, Count) when length(State) == Count ->
io:format("end of loop~p~n", [length(State)]);
loop(State, Count) ->
receive
{hello, Id, "Hello World!", _SenderPid} -> loop([Id | State], Count);
_ -> loop(State, Count)
end.
sendback(To, Id, E) ->
To ! {hello, Id, decrypt_text(E), self()}.
%% Encryption utilities.
encryption_key() -> <<16#01,16#23,16#45,16#67,16#89,16#AB,16#CD,16#EF,16#F0,16#12,16#34,16#56,16#78,16#9A,16#BC,16#DE>>.
encryption_iv() -> <<16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00>>.
encrypt_text(PlainText) ->
encrypt_bin(erlang:list_to_binary(PlainText)).
encrypt_bin(Binary) ->
Key = encryption_key(),
IVec = crypto:aes_cbc_ivec(encryption_iv()),
crypto:aes_ctr_encrypt(Key, IVec, Binary).
decrypt_text(Encrypted) ->
erlang:binary_to_list(decrypt_bin(Encrypted)).
decrypt_bin(Encrypted) ->
Key = encryption_key(),
IVec = crypto:aes_cbc_ivec(encryption_iv()),
crypto:aes_ctr_decrypt(Key, IVec, Encrypted).
こちらがcrypto処理無しの方。
-module(bench).
-import(lists, [foreach/2]).
-compile(export_all).
start(A) ->
E = "Hello World!",
L = lists:seq(1, A, 1),
SendBackPid = self(),
StartTime = erlang:now(),
lists:map(fun(X) -> spawn(fun() -> sendback(SendBackPid, X, E) end) end ,L),
loop([], A),
EndTime = erlang:now(),
Diff = timer:now_diff( EndTime, StartTime ),
io:format("elapsed time: ~p (sec)~n", [ Diff / 1000000 ]).
loop(State, Count) when length(State) == Count ->
io:format("end of loop~p~n", [length(State)]);
loop(State, Count) ->
receive
{hello, Id, "Hello World!", _SenderPid} -> loop([Id | State], Count);
_ -> loop(State, Count)
end.
sendback(To, Id, E) ->
To ! {hello, Id, E, self()}.
http://www.erlang.org/doc/man/timer.html#tc-3
おー。便利そうですね!! これ使えるようにしておきます^^