优化c中的数学运算
我在一个网络编程c中注册了几个算法练习。 我做了一个很简单的问题如下: 我收到4个数字,确定一个矩形的2个角的坐标,并且必须计算面积。 有一组测试,当第二个角落在第一个(x1> x2 || y1> y2)的左下方时,程序退出。 优化c中的数学运算
例:
输入:
1 1 4 3
0 0 1 1
9 7 3 6 //Exit
输出:
6
1
这是我的代码。
#include <stdio.h>
#include <stdlib.h>
int main()
{
while(1) {
int x1, x2, y1, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);//x1 y1 == A, x2 y2 == B
if(x1 > x2 || y1 > y2)
return 0;
printf("%d\n", (x2 - x1) * (y2 - y1));
}
}
我的问题只是一个好奇心。我用“0052”的时间解决了这个问题,在我面前有3个人在“0048”和“0024”中设法解决! 我可以使用什么optimisazion方法来缩短时间?可能是指针?
的几点思考:
你可以使用gcc的
__builtin_expect()
功能,以确保该条件被认为是假的。指针不太可能帮助您改进解决方案。
scanf()
可能是真的很慢的部分。用一个只有预期的十进制整数的解析器重写这个可能会快得多。目前,scanf()
需要解析格式字符串,并且输入数字可以是八进制,十六进制或十进制。或者可能是无效输入。等等。
我应该如何在我的程序中使用__builtin_expect()?我从来没有使用它,我不知道如何应用它。 – Raxkin 2014-12-06 22:55:16
@Raxkin:我通常通过助手宏'很可能(x)'和'不太可能(x)'来使用它们:http://*.com/questions/109710/likely-unlikely-macros-in-the-linux-内核 – 2014-12-06 23:47:08
这个问题是一个完整的废话。它是计时器的标准I/O语句,程序员无法控制。 (其他陈述的时间 - 缩减两个基本的C表达式,没有什么可以优化 - 相比之下,可笑的是很小)。 – 2014-12-07 09:12:47
here are my suggestions:
1) in the compile statement use:
gcc -O3
2) place all working variables in global space rather than stack space
int x1, x2, y1, y2;, area
char buffer[100];
int main()
{
do
{
fgets(buffer, sizeof(buffer), stdin);
sprintf(buffer, "%d %d %d %d", &x1, &y1, &x2, &y2);
x2-=x1;
y2-=y1;
area = y2*x2;
printf("%d\n",area); // or perhaps puts(itoa(area));
} while((0 <= x2) && (0 <= y2)
return(0);
}
这是一个在线竞赛,你不需要编译你自己的代码并提交二进制 – smac89 2014-12-07 05:06:12
这对我来说是什么,我没有提交任何二进制 – user3629249 2014-12-07 05:36:11
你建议OP使用编译器优化标志。这就是为什么我说你在提交前不编译你的代码。在线裁判进行编译和测试,您只需编写代码 – smac89 2014-12-07 05:38:16
'scanf'和'printf'(每次刷新都会)比其他任何东西都慢(*多*)。 – 2014-12-06 22:58:39
定时等待键盘输入的函数是无稽之谈。你正在为打字员计时。 – 2014-12-07 09:08:04