1. 测试用例及代码库
  2. 机器配置
  3. 测试结果

    3.1 EVM

    3.2 AElf

    3.2.1 LoopDivAdd10M

    3.2.2 LoopExpNop1M
  4. 测试结论

近期对标以太坊做了一系列针对测试,在此次测试过程中,我们发现在同一机型上,运行同样的测试用例,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倍。

最新文章

  1. ios 获取手机的IP地址
  2. (转)Vsdocman7.2 注册版
  3. SignalR入门之多平台SignalR服务端
  4. nodeJS Express 删除 x-powered-by
  5. 转:windows下命令行工具
  6. django views中提示cannot convert dictionary update sequence element #0 to a sequence错误
  7. php的urlencode()URL编码函数浅析
  8. C#之结构化异常处理
  9. Qt之QuaZIP(zip压缩/解压缩)
  10. Ehcache(01)——简介、基本操作
  11. XP纯净版光盘ISO镜像文件
  12. java transient简单介绍
  13. C++文件操作详解(ifstream、ofstream、fstream)
  14. webuploader限制只上传图片文件
  15. png转tif
  16. UVA 11613 Acme Corporation(不固定流量的最小费用流)
  17. docker+Nexus Repository Manager 搭建私有docker仓库
  18. FOJ-1001-Duplicate Pair
  19. boosting_bagging
  20. 读书笔记_Effective_C++_条款三十五:考虑virtual函数以外的其他选择

热门文章

  1. hyper-v简介及安装使用
  2. python-11-字典的增删改查
  3. 使用pymysql模块进行封装,自动化不可或缺的数据库校验
  4. hibernate中的merge()方法
  5. 数据库——SQL-SERVER练习(6) 数据库安全性
  6. AQS(抽象队列同步器)
  7. npm ERR! code Z_BUF_ERROR
  8. Android Toolbar中的title居中问题
  9. 一文解读ITIL (转)
  10. ms sql事务输出错误