今天遭遇最诡异的事情:改变一下函数名引起运行效率的几十倍差异!
整个程序如下,其中strncmp()用了库函数的源代码,大家可以直接编译成可执行文件运行一下,只要2秒钟就算完了。
但是诡异的地方在于,当把strncmp()改成其他的任意名字之后,发现速度立马变得很慢,要一分多钟才算完。
太奇怪了,难道连函数名字都会影响速度吗?无语。。。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#undef strncmp
int strncmp(const char *, const char *, size_t);
void print_time();
main()
{
char *s1,*s2;
long i;
s1 = (char *) malloc(40);
s2 = (char *) malloc(40);
s1 = "abcdabcdabcd";
s2 = "abcdabcdabcdabcdabcdabcd";
print_time();
for(i=0;i<100000000;i++)
strncmp(s1,s2,20);
print_time();
}
int
strncmp (s1, s2, n)
const char *s1;
const char *s2;
size_t n;
{
unsigned char c1 = '\0';
unsigned char c2 = '\0';
if (n >= 4)
{
size_t n4 = n >> 2;
do
{
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0' || c1 != c2)
return c2 - c1;
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0' || c1 != c2)
return c2 - c1;
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0' || c1 != c2)
return c2 - c1;
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0' || c1 != c2)
return c2 - c1;
} while (--n4 > 0);
n &= 3;
}
while (n > 0)
{
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0' || c1 != c2)
return c2 - c1;
n--;
}
return c2 - c1;
}
void print_time()
{
time_t ltime;
ltime = time(NULL);
printf("%s",ctime(<ime));
}