- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想优化 CFD 中不同函数的使用代码,用户可以在运行时通过程序读取的配置文件来选择。
我想出了一个最小的工作示例,其中有两个单独的函数和一个输入。一种将输入平方,一种将其立方。通过命令行选项,用户可以选择要使用的功能。在 for 循环中编写正方形/立方体一堆数字的代码(它计算 x^2 或 x^3 从 0 到 1 的积分,具体取决于选择的函数)并输出结果。第一个变体只是 for 循环 (case1) 中的一个 switch case。我尝试的第二件事是一个函数指针,它被设置在循环之前 (case2)。我做的第三件事是有选择地只编译用户打算使用预处理器命令(案例 3)使用的函数。
案例一:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
double f_square(double x) {return x * x;}
double f_cube(double x) {return x * x * x;}
int main(int argc, char *argv[])
{
double x;
double sum = 0;
double del_x = 4e-10;
printf("Speed test -- no optimisation\n");
clock_t startClock = clock();
for (x = 0; x < 1; x += del_x) {
switch (argv[1][0]) {
case '2':
sum += f_square(x) * del_x;
break;
case '3':
sum += f_cube(x) * del_x;
break;
default:
printf("Invalid choice! Abort\n");
exit(1);
}
}
clock_t endClock = clock();
printf("Int_{0}^{1} x^%c: %.8g\n", argv[1][0], sum);
printf("Execution time: %.6f\n", (endClock - startClock) / (double)CLOCKS_PER_SEC);
}
案例2:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
double f_square(double x) {return x * x;}
double f_cube(double x) {return x * x * x;}
int main(int argc, char *argv[])
{
double x;
double sum = 0;
double del_x = 4e-10;
double (*f)(double);
printf("Speed test -- function pointers\n");
switch (argv[1][0]) {
case '2':
f = &f_square;
break;
case '3':
f = &f_cube;
break;
default:
printf("Invalid choice! Abort\n");
exit(1);
}
clock_t startClock = clock();
for (x = 0; x < 1; x += del_x) {
sum += f(x) * del_x;
}
clock_t endClock = clock();
printf("Int_{0}^{1} x^%c: %.8g\n", argv[1][0], sum);
printf("Execution time: %.6f\n", (endClock - startClock) / (double)CLOCKS_PER_SEC);
}
案例3:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#ifdef SQUARE
double f(double x) {return x * x;}
#endif
#ifdef CUBE
double f(double x) {return x * x * x;}
#endif
int main(void)
{
double x;
double sum = 0;
double del_x = 4e-10;
printf("Speed test -- selective compilation\n");
clock_t startClock = clock();
for (x = 0; x < 1; x += del_x) {
sum += f(x) * del_x;
}
clock_t endClock = clock();
#ifdef SQUARE
printf("Int_{0}^{1} x^2: %.8g\n", sum);
#endif
#ifdef CUBE
printf("Int_{0}^{1} x^3: %.8g\n", sum);
#endif
printf("Execution time: %.6f\n", (endClock - startClock) / (double)CLOCKS_PER_SEC);
}
在测量执行时间时我发现了一些奇怪的事情:
下面是一些比较执行时间的图片
这让我感到困惑,我想知道我可以做些什么才能在不损失性能的情况下使用函数指针,因为出于灵 active 原因,我真的很想使用函数指针。
=> 为什么函数指针这么慢?
我想补充一点,我不是软件工程师,而是一名航空航天工程专业的学生,遗憾的是我们没有太多的编程类(class),所以每一个细节都可能有所帮助。
最佳答案
这是相似功能的两个实现的反汇编 View :https://c.godbolt.org/z/l24Zhl
请注意,使用 -O2,第一个方法内联对 f_cube
和 f_square
的调用(注意没有调用程序集中的函数),但第二个版本会不是。
很可能,第一个版本由于 Branch Prediction 而进一步加速在处理器上。
您是否分析过您的代码并发现该区域是一个瓶颈?请记住,首先优化最常用的代码可以最大程度地提高速度。请记住:先使其工作,然后再使其快速。
关于c - 如何优化 CFD C 代码中的决策,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56956260/
我对术语“来自深度图像的Canny线(CFD)”感到困惑。 因此,当我阅读论文时,他们在深度图像上使用了Canny线检测功能,这意味着输入图像类似于this吗? 所以基本上是2D图像,其中每个像素的颜
我试图理解一段来自 paper concerning fluid simulations for games 的代码。我正在研究边界条件的解决方法。由于我不了解 C++,所以我遇到了额外的困难。 据我
我有一个结构化网格,大约有 3e+6 个点, 请查看图片: /image/eUUkQ.jpg 物理域(欧几里得)中的每个点在计算域中都有一个索引(i、j 和 k)。 我需要迭代计算域索引并使用相应的点
目标:从 Jira 导出故事状态,以便我可以在 Excel/其他包中显示 CFD。 问题:故事历史状态(日期)似乎不能“导出”到 CSV 我想将 Jira for Stories 的累积流程图 (CF
我想优化 CFD 中不同函数的使用代码,用户可以在运行时通过程序读取的配置文件来选择。 我想出了一个最小的工作示例,其中有两个单独的函数和一个输入。一种将输入平方,一种将其立方。通过命令行选项,用户可
这个问题已经有答案了: Segmentation fault on large array sizes (7 个回答) 已关闭 7 年前。 我这样定义数组: double uo[n+2][m+2][n
用户定义函数 (UDF) 是一种可以编程的函数,可以与 CFD 软件 Fluent Solver 一起动态加载,以增强标准功能。 UDF 是用 C 编程语言编写的。 以下是我的 UDF 的一部分: /
我是一名优秀的程序员,十分优秀!