这两个程序之间的最大区别是,Go代码会忽略错误(如果幸运的话,如果您清空池,则会忽略错误(如果发生错误,将会恐慌或出现段错误),而C
++代码则会通过异常传播错误。比较:
if p.size == 0 { fmt.Printf("Attempting to pop from empty pool!n")}
与
if(_size == 0){throw std::out_of_range("");}
至少有三种方法1可以使比较公平:
- 可以像在Go中一样更改C ++代码以忽略该错误,
- 将两个版本都更改为
panic
/abort
错误。 - 像在C ++中一样,更改Go版本以惯用的方式处理错误2。
因此,让我们全部完成并比较结果3:
- C ++忽略错误:墙1.059329s,用户1.050000s + 0.000000s系统= 1.050000s CPU(99.1%)
- C ++因错误而中止:1.081585s墙,1.060000s用户+ 0.000000s系统= 1.060000s CPU(98.0%)
- 对错误惊慌:经过的时间:1.152942427s
- 忽略错误:经过的时间:1.196426068s
- 进行惯常的错误处理:经过的时间:1.322005119s
- C ++例外:壁1.373458s,用户1.360000s + 0.000000s系统= 1.360000s CPU(99.0%)
所以:
- 没有错误处理,C ++比Go更快。
- 有了恐慌,Go的速度提高了4倍,但仍然不及C ++。
- 通过惯用的错误处理,C ++的速度比Go慢得多。
为什么?该异常实际上不会在您的测试运行中发生,因此实际的错误处理代码绝不会以任何一种语言运行。但是
clang无法证明它不会发生。而且,由于您永远不会
catch在任何地方出现异常,这意味着它必须针对整个堆栈中的每个非遗漏帧发出异常处理程序和堆栈展开器。因此,它在每个函数调用和返回上都要做更多的工作-
不需要 做 更多的工作,但是随后您的函数做的实际工作却很少,以至于不必要的额外工作加起来了。
1.您还可以更改C ++版本以执行C风格的错误处理,或使用Option类型,以及可能的其他可能性。
2.当然,这需要进行很多更改:您需要导入
errors,将的返回类型更改
Acquire为
(*Node,error),将的返回类型更改
processAge为
error,更改您的所有
return语句并至少添加两个
if err != nil { …}检查。但这对Go来说应该是一件好事,对吧?
3.当我在这,我换成你的遗产
boost::timer有
boost::auto_cpu_timer,所以我们现在看到的挂钟时间(如围棋)以及CPU时间。
4.我不会尝试解释原因,因为我不理解。快速浏览一下组装,显然已经对某些检查进行了优化,但是我不明白为什么如果没有,就无法优化相同的检查
panic。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)