- 測試用例及程式碼庫
- 機器配置
- 測試結果
3.1 EVM
3.2 AElf
3.2.1 LoopDivAdd10M
3.2.2 LoopExpNop1M - 測試結論
近期對標以太坊做了一系列針對測試,在此次測試過程中,我們發現在同一機型上,執行同樣的測試用例,aelf的合約執行效率遠高於以太坊EVM的合約執行效率。
以太坊的合約執行效率低,一方面因為虛擬機器機制和gas費規則帶來的一定開銷導致效率降低,另一方面因為EVM的256位設計導致合約執行效率更低。
而aelf使用C#的發射機制來呼叫合約,並且沒有多餘設計,合約執行效率自然遠高於以太坊的合約執行效率
1.測試用例及程式碼庫
以下是對標以太坊 loop-DivAdd-10M.json 和 loop-exp-nop-1M.json的測試情況
ETH: 基於官網go實現版本
https://github.com/ethereum/go-ethereum
AELF: 基於官方C#實現版本
https://github.com/AElfProject/AElf
測試用例,對標ETH的標準測試:
https://github.com/ethereum/tests/tree/develop/src/VMTestsFiller
對應aelf測試用例:
https://github.com/AElfProject/AElf/blob/dev/bench/AElf.Benchmark
2.機器配置
Test Enviornment:
OS=ubuntu 16.04
QEMU Virtual CPU, 2 CPU, 2 logical and 2 physical cores
CPU MHz: 2194.916; cache size : 16384 KB
AElf Test Environment:
BenchmarkDotNet=v0.11.5
.NET Core SDK=2.2.203
[Host] : .NET Core 2.2.4 (CoreCLR 4.6.27521.02, CoreFX 4.6.27521.01), 64bit RyuJIT DEBUG
3.測試結果
LoopDivAdd10M:EVM耗時為aelf的169倍,差兩個數量級
LoopExpNop1M:EVM耗時為aelf的1223倍,差三個數量級
3.1 EVM
官方go實現版本的自帶測試程式執行結果
LoopDivAdd10M:14.236813572s
LoopExpNop1M: 639.16568ms
3.2 AElf
LoopDivAdd10M:84.01ms
LoopExpNop1M: 522.5us
3.2.1 LoopDivAdd10M
除法加法迴圈一千萬次
方法
public override DoubleValue LoopDivAdd(DivAddTestInput input)
{
var r = input.X;
for (uint i = 0; i < input.N; i++)
{
r /= input.Y;
r += input.K;
}
return new DoubleValue {Value = r};
}
輸入
new DivAddTestInput()
{
X = 100,
Y = 300,
K = 500,
N = 10000000
}
執行結果:
3.2.2 LoopExpNop1M
方法
public override Int32Value LoopExpNop(PerformanceTesteInput input)
{
for (uint i = 0; i < input.N; i++)
{
}
return new Int32Value {Value = input.Seed};
}
輸入
new PerformanceTesteInput()
{
Exponent = 0,
Seed = _executeResult,
N = 1000000
}
執行結果:
4.測試結論
在試驗機配置相同的情況下:
迴圈執行1000萬次加法、除法測試後:
以太坊EVM約需要14236.81毫秒
而在aelf的節點測試中僅需84.01毫秒,高於EVM 169倍。
空迴圈執行100萬次後:
以太坊EVM需要639.16毫秒
而在aelf的節點測試中僅需0.5225毫秒,高於EVM 1223倍。