在高性能计算中慎用C++ std::complex

 

Copyright (c) prototype, all rights reserved

在不对原文内容(包括作者信息)做任何改动的前提下,欢迎自由转载。
 
两年多前写的内部资料。现在自己把它翻成中文,贴到我的blog上来。
 
近来闲暇时,我用C++和表达式模板(expression template)技术实现了一个复数类(注意:是类,而不是类模板)— Complex。在类型上,它相当于std::complex<float>,但它可以很容易通过一个typedef变成一个与std::complex<double> 或 std::complex<long double>相当的类。在功能上,它实现了各种运算符重载和各种函数。最初设计和实现这个类的目的只是单纯的为了好玩,顺便温故一下已经许久没碰过的表达式模板技术。在一切必要的功能都实现完毕后,我想到和std::complex比较一下运行速度,结果却令人非常吃惊。原始结果直接copy/paste在下面。
 
一些说明:
1.测试条件:运行平台为PIII 750,WinXP Home/Cygwin。编译器为gcc 3.3.2。优化条件为 -O3 -NDEBUG。
2.程序输出格式举例说明如下:
 
complex += complex ======
// 表示比较的内容为:+= 运算符。
 
Complex
370
// 表示完成一定数目(10000000)运算,Complex所需要的tick数(越小越好/快)。
 
std::complex<Real>
331
// 表示完成相同数目的运算,std::complex<float> 所需要的tick数。Real 其实就是float的一个typedef。
 
 
测试结果:
 
complex += complex ======
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值