assembly - 在C 程序中,程序集如何能够比算术加法操作更多的CPU时钟进行操作

  显示原文与译文双语对照的内容
125 4

我想测试按位运算是否真的比算术运算更快。我以为他们是。

我写了一个小的C 程序来测试这个假设,并且我意味着加入的平均值比按位。这对我来说很奇怪,我无法理解为什么会发生这种情况。

由于我所知道的加上比较少的位,因为结果取决于所承载的结果。逻辑运算符比加法慢,这对我来说是没有意义的。

我的鳕鱼在下面

#include<stdio.h>
#include<time.h>
int main() 
{
 int x=10;
 int y=25;
 int z=x+y;
 printf("Sum of x+y = %i", z);
 time_t start = clock();
 for(int i=0;i<100000;i++)z=x+y;
 time_t stop = clock();
 printf("nnArithmetic instructions take: %d",stop-start);
 start = clock();
 for(int i=0;i<100000;i++)z=x&y;
 stop = clock();
 printf("nnLogic instructions take: %d",stop-start);
}

一些结果:

Arithmetic instructions take: 327
Logic instructions take: 360
Arithmetic instructions take: 271
Logic instructions take: 271
Arithmetic instructions take: 287
Logic instructions take: 294
Arithmetic instructions take: 279
Logic instructions take: 266
Arithmetic instructions take: 265
Logic instructions take: 296

这些结果是由程序连续运行的。

从平均值上可以看出,逻辑运算符平均平均比算术运算符长。

时间:原作者:0个回答

116 3

好,我们拿这个"测量"放大它,100k 有点小

#include<stdio.h>
#include<time.h>
#define limit 10000000000
int main() 
{
 int x=10, y=25, z;
 time_t start = clock();
 for(long long i=0;i<limit;i++)z=x+y;
 time_t stop = clock();
 printf("Arithmetic instructions take: %ldn",stop-start);
 start = clock();
 for(long long i=0;i<limit;i++)z=x&y;
 stop = clock();
 printf("Logic instructions take: %ldn",stop-start);
}

这将运行一段时间。首先让我们尝试无优化:

thomas@TS-VB:~/src$ g++ -o trash trash.c 
thomas@TS-VB:~/src$./trash 
Arithmetic instructions take: 21910636
Logic instructions take: 21890332

你看这两个循环的时间。

使用-S编译揭示了( 这里只显示. s 文件的相关部分):

//this is the assembly for the first loop
.L3:
 movl 32(%esp), %eax
 movl 28(%esp), %edx
 addl %edx, %eax//<<-- ADD
 movl %eax, 40(%esp)
 addl $1, 48(%esp)
 adcl $0, 52(%esp)
.L2:
 cmpl $2, 52(%esp)
 jl. L3
 cmpl $2, 52(%esp)
 jg. L9
 cmpl $1410065407, 48(%esp)
 jbe. L3
//this is the one for the second
.L9:
 movl 32(%esp), %eax
 movl 28(%esp), %edx
 andl %edx, %eax//<<--- AND
 movl %eax, 40(%esp)
 addl $1, 56(%esp)
 adcl $0, 60(%esp)
.L5:
 cmpl $2, 60(%esp)
 jl. L6
 cmpl $2, 60(%esp)
 jg. L10
 cmpl $1410065407, 56(%esp)
 jbe. L6
.L10:

查看 CPU 指令集告诉我们,添加和将采取相同的循环 -->,2循环将运行相同的时间。

现在进行优化:

thomas@TS-VB:~/src$ g++ -O3 -o trash trash.c 
thomas@TS-VB:~/src$./trash 
Arithmetic instructions take: 112
Logic instructions take: 74

循环已经被优化。计算的值永远不需要,所以编译器决定根本不运行它

结论:如果你在林中射击 3次,并击中 2 boars和 1兔子,那么它并不意味着里面的boars比

原作者:
...