gpt4 book ai didi

c++ - gsl_complex 与 std::complex 性能对比

转载 作者:行者123 更新时间:2023-11-30 01:21:02 31 4
gpt4 key购买 nike

我正在编写一个很大程度上依赖于复杂的加法和乘法的程序。我想知道我是否应该使用 gsl_complexstd::complex .

我似乎没有在网上找到关于 GSL 复数算法与 std::complex 相比好多少的比较。 .基本的谷歌搜索也没有帮助我找到 GSL complex 的基准页面。

我写了一个 20 行的程序,它生成两个随机的复数数组(其中 1e7 个),然后使用 clock() 检查加法和乘法所用的时间。来自 <ctime> .使用这种方法(没有编译器优化)我知道 gsl_complex_addgsl_complex_mul几乎是 std::complex<double> 的两倍的 +*分别。但我以前从未做过这种事情,所以这就是你检查哪个更快的方式吗?

任何链接或建议都会有所帮助。谢谢!

编辑:

好的,所以我用 -O3 标志再次尝试,现在结果截然不同! std::complex<float>::operator+gsl_complex_add 的两倍多, 而 gsl_complex_mul大约是 std::complex<float>::operator* 的 1.25 倍.如果我使用 double,gsl_complex_addstd::complex<double>::operator+ 快约 30%同时 std::complex<double>::operator*gsl_complex_mul 快大约 10% .我只需要浮点精度,但我有 heard那个 double 更快(内存对我来说不是问题)!所以现在我真的很困惑!

最佳答案

开启优化。

您链接的任何库或函数集都将编译WITH优化(除非开发人员的名字是 Kermit、Swedish Chef、Miss Peggy(项目经理)和 Cookie Monster(测试人员) - 换句话说,开发团队是一群布偶)。

由于 std::complex 使用模板,它是由您提供的编译器设置编译的,因此代码将未经优化。所以你的问题真的是“为什么函数 X 比做同样事情的函数 Y 快,当函数 X 是经过优化编译而 Y 是在没有优化的情况下编译时?” - 答案应该很明显:“优化几乎一直有效!” (如果优化在大多数情况下都不起作用,编译器开发人员的时间会轻松得多)

编辑:所以我的上述观点刚刚得到证明。请注意,由于模板可以内联代码,因此它通常比外部库更有效(因为编译器可以直接将指令插入流中,而不是调用另一个函数)。

关于 floatdoublefloat 唯一比 double 慢的情况是只有 double 硬件可用,在 floatdouble 之间添加了“缩短”和“延长”两个功能。我不知道有任何这样的硬件。 double 有更多的位,所以它应该花费更长的时间。

编辑2:

在选择“一个解决方案而不是另一个”时,有很多因素。性能是其中之一(在某些情况下,最重要,在其他情况下则不是)。其他方面是“易用性”、“可用性”、“适合项目”等。

如果您只看性能,有时可以运行简单的基准测试来确定一个解决方案比另一个更好或更差,但是对于复杂的库 [不是“实数和虚数”类型的复数,而是“复杂的”],有有时优化处理大量数据,如果您使用不太复杂的解决方案,“大数据”将不会达到相同的性能,因为在解决“大数据”类型问题上花费的精力较少。所以,如果你有一个“简单”的基准测试,它对一小组数据进行一些基本计算,而你实际上要运行一些更大的数据集,那么这个小的基准测试可能无法反射(reflect)现实。

而且我或其他任何人都无法告诉您哪种解决方案可以为您的系统和您的数据集提供最佳性能,除非我们可以访问您的数据集,确切地知道您正在执行哪些计算(即是,几乎有你的代码),并且有使用这两个“包”运行它的经验。

继续其他标准(“易用性”等),这些标准更多地基于“个人意见”,因此首先不适合 SO 问题。

关于c++ - gsl_complex 与 std::complex 性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18672097/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com