fputc性能和优化

时间:2014-03-16 20:49:51

标签: c++ c

我一直看到一些奇怪的行为,我写的一个程序,我无法解释,我想知道是否有人可以向我解释这里发生了什么。我觉得这是由g ++与-O3一起使用的一些高级优化技术引起的,但我不确定。

我正在运行与此类似的东西(不是一个完整的例子):

char* str = "(long AB string)"; // string _only_ consisting of As and Bs 
size_t len = strlen(str);
for(unsigned long offset = 0; offset < len; offset++) {
    if(offset % 100 == 0) fputc('\n', f);
    fputc(str[offset], f);
}

这很慢。但是,当我另外检查这样的角色时,突然变得非常快:

char* str = "(long AB string)"; // string _only_ consisting of As and Bs 
size_t len = strlen(str);
for(unsigned long offset = 0; offset < len; offset++) {
    if(offset % 100 == 0) fputc('\n', f);
    if(str[offset] != 'A' && str[offset] != 'B') exit(1);
    fputc(str[offset], f);
}

尽管字符串只包含As和Bs,所以写入的字符数不会改变,程序总是正常退出。

有人可以向我解释这里发生了什么吗?字符检查是否允许优化器对str [offset]进行一些假设,否则它无法进行,允许它优化fputc调用的某些部分?

2 个答案:

答案 0 :(得分:1)

编译器将所有内容优化成一个简单的

exit(1)

因为编译器足够智能以识别字符串常量&#34;(长字符串)&#34;不包含任何A或B&#39;

坦率地说,我不会期望gcc能够发现它;)

答案 1 :(得分:0)

在C中,fputc(3)被强制为一个函数;相当于通常实现为宏putc(3),它直接访问FILE缓冲区。很难做得更快,除了可能使用fwrite(3)一次复制一段字符而不是一个一个地复制。但是这样的用法正好适用于putc(3)应该优化的内容,所以......

仅通过预处理(gcc -E)和编译到汇编程序(gcc -S)来分析基础C级别的循环,这可能会提供一些线索。

确定(即,有具体的测量结果)这个循环是性能关键的(甚至是相关的)?那真的很奇怪。