c++ - 有效地处理调用一百万次的 C/C++ 函数

标签 c++ c algorithm optimization

对于编程问题,我是 C 和 stackoverflow 的新手。我已经对我的问题进行了一些谷歌搜索,但无法找到直接解决该问题的信息。但是,我也可能对这个主题太陌生,以至于我不确定哪些术语适合搜索。如果这是一个常见问题,我深表歉意。

我的程序正在执行科学计算。特别是,它主要涉及获取给定的坐标和给定的力,并根据一系列计算更新所有内容。为了得到结果,我对每件事都进行了大约一百万次,所以我很关心如何让它尽可能高效。特别是我发现我有 3 种类型的变量

  1. 不变的变量
  2. 在迭代之间变化的临时变量 并且只是在计算中用作占位符
  3. 每次迭代都会更改然后继续执行的数据 下一个

声明这些不同变量的最有效方法是什么?出于天真,我很想将所有内容都声明为全局变量,我很确定这对类型 (1) 和 (3) 的变量有意义。但是对于类型 (2) 我不确定。如果我调用一个函数一百万次,并且每次调用它时都会初始化一个临时变量,这是否比我拥有一个它会更改的全局临时值浪费更多时间?

最佳答案

If I call a function a million times and every time it is called in initializes a temporary variable, does this waste more time than if I have a global temp value that it alters instead?

不,甚至有可能恰恰相反。在堆栈上创建一个临时变量。

分配堆栈变量没有性能成本
当函数被调用时,堆栈指针无论如何都必须移动,以便为函数参数和其他东西腾出空间。现在,如果必须分配一个额外的变量,所要做的就是增加堆栈指针移动的量。
与 Java 不同,您可以让变量保持未初始化状态,并在需要时直接存储最终值,这样就没有初始化成本。

Locality of reference
当您使用堆栈变量时也更好。这意味着函数使用的值彼此更接近,这有助于处理器更有效地缓存数据。缓存通常按 64 字节的行组织,这意味着彼此相邻的两个 32 位值比两个分散的值更有效。
发生分页时,空间局部性尤为重要,因为从永久存储加载页面会巨大性能成本。因此,最好将特定时间所需的所有变量存储在一起,以便它们适合一页。

关于c++ - 有效地处理调用一百万次的 C/C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29808488/

相关文章:

algorithm - 汉诺塔的递归解决方案

algorithm - 是否可以从 (a,b) 移动到 (c,d)

algorithm - 弱交替自动机上的空性

C++:何时以及为何调用析构函数?

c - 过程信号掩码,阻塞信号集和阻塞信号之间的区别?

c - 运算符优先级和三元运算符

C 原型(prototype)范围

c++ - Bst- 为什么我的 Best 在将 node* 更改为 node*& 后工作?

C++ 编译时检查微 Controller 引脚是否已从其他源文件初始化

c++ - 向我介绍 boost::exception