【问题标题】:What are a few time-consuming operations in C?C中有哪些耗时的操作?
【发布时间】:2009-07-15 18:54:02
【问题描述】:

我希望编写一个可以在各种机器上编译和运行的快速基准测试程序。与其使用商业/开源可用的选项,我更愿意自己使用线程和算法优化技术。

我已经使用了几个,其中包括递归计算斐波那契数列的第 n 个数,以及播种/rand() 几千次。

是否有其他算法相对简单,但同时计算密集(可能与数学相关)?

(请注意,这些操作将在 C 语言中实现。)

【问题讨论】:

  • 那么你想对什么进行基准测试?整数性能?浮点? RAM访问速度?各种缓存级别的大小和速度?我能看到的唯一一件事是您对 I/O 不感兴趣(这可能在大多数人所做的任务中占主导地位)。

标签: c algorithm math cpu benchmarking


【解决方案1】:

Ackermann function 通常很有趣,但如果你想让它在你的一生中完成,就不要给它很大的投入。

【讨论】:

    【解决方案2】:

    分形

    (在各种分辨率下)Some fractal source in C (without opengl)

    【讨论】:

    • +1:我喜欢这个,因为你可以享受结果。或者,如果您使用迭代改进自身的算法,您可以观察它的工作情况,这将更加有趣!
    • 是的,只是不要通过 OpenGL 使用 GPU,这显然会破坏基准测试的目的。您还可以享受大量复杂数学的乐趣,它们一起滥用数学 API 进行基准测试并制作漂亮的分形
    【解决方案3】:

    我知道您说过您想自己制作,但也许您可以从现有的基准中汲取灵感。 The Computer language benchmark game 通过一组基准测试运行了许多编程语言。也许您可以通过查看他们的基准获得一些想法。

    我脑海中的一些快速想法:

    • 矩阵乘法:乘以 2 大矩阵相对 计算密集型,虽然你 必须考虑缓存

    • 生成素数

    • 整数分解

    • 求解 ODE 的数值方法 - 以Runge-kutta 为例

    【讨论】:

      【解决方案4】:

      反转大矩阵。

      【讨论】:

        【解决方案5】:

        您可以计算大素数或分解整数。

        【讨论】:

          【解决方案6】:

          看看NAS Parallel Benchmarks。这些最初是由 NASA 在 Fortran 中为使用 MPI 的超级计算机编写的(并且仍然可用这种方式),但现在也有 C、Java 和 OpenMP 实现可用。

          其中大多数是非常计算密集型的,因为它们旨在代表科学计算中使用的数值算法。

          【讨论】:

            【解决方案7】:

            尝试计算数千或数百万pi 位数。有不少formulas 用于该任务。

            【讨论】:

            • QEmu 成名的Fabrice Bellard 是最有效的圆周率计算公式的发现者... bellard.org/pi 多才多艺! ...并且他通过实现赢得了源代码混淆竞赛!
            • 我在 Linux 杂志上读过一篇关于 Fabrice Bellard 的文章。聪明的家伙!
            【解决方案8】:

            project euler 中有一些非常不错的值,它们都与数学相关,如果你想使用更高的值,可能会很耗时。

            【讨论】:

            • 并非如此,使用适当的算法(这是谜题试图激发的)大多数问题都可以很好地扩展。不幸的是,对于这些问题中的许多问题,常见的硬件足够快,以至于蛮力也足够快,有时甚至是巨大的优势。
            • 我知道,但如果他使用一些更难的问题(以及那些增加值会使它们更耗时的问题),他将获得值得在基准应用程序中使用的算法
            【解决方案9】:

            寻找素数被认为是相当耗时的。

            【讨论】:

              【解决方案10】:

              从语言大战中查看基准:http://shootout.alioth.debian.org/

              但是:基准只是基准,不一定能告诉您很多关于现实世界的信息,相反,可能会产生误导。

              【讨论】:

                【解决方案11】:

                如果您想尝试并行性,请进行大量矩阵数学运算。您可以使用的矩阵大小将受内存限制,但您可以根据需要进行尽可能多的迭代。

                这将强调现代 CPU 附带的 SIMD 指令。

                【讨论】:

                  【解决方案12】:

                  这做了很多补充:

                  int c = 0; 
                  for (int n = 0; n < INT_MAX; n++)
                      for (int m = 0; m < INT_MAX; m++)
                          c++;
                  
                  std::cout << c;
                  

                  【讨论】:

                  • 其实不然。任何体面的编译器都会看到你对 n 或 m 完全没有做任何事情,因此会对其进行优化。
                  • 加数字是计算机最擅长的事情之一。任意宽度的浮点乘法会更密集!
                  • @Ken White - 进行了调整。
                  • @Aiden Bell - 如果你做了更多添加呢?
                  【解决方案13】:

                  您可以尝试使用非常大的输入集的 tsort(Turbo 排序)。我理解这是一种常见的操作。

                  【讨论】:

                    【解决方案14】:

                    NP-Complete 问题的启发式方法是获取一些 CPU 密集型代码的有趣方式。您可以为Karps NP-Complete 问题之一编写“解决方案”:)。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-02-15
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-07-21
                      • 1970-01-01
                      • 2013-10-18
                      相关资源
                      最近更新 更多