아무도 언급하지 않았으므로 성능에 대한 메모를 추가하겠습니다.
정상적인 상황에서 컴파일러 최적화가 사용되지 않는다고 가정하면 (즉, printf()
실제로 호출 printf()
하지 않고 fputs()
) printf()
, 특히 긴 문자열의 경우 효율성이 떨어질 것으로 예상 합니다. printf()
변환 지정자가 있는지 확인하기 위해 문자열을 구문 분석해야 하기 때문 입니다.
이를 확인하기 위해 몇 가지 테스트를 실행했습니다. 테스트는 gcc 4.8.4로 Ubuntu 14.04에서 수행됩니다. 내 컴퓨터는 Intel i5 CPU를 사용합니다. 테스트중인 프로그램은 다음과 같습니다.
#include <stdio.h>
int main() {
int count = 10000000;
while(count--) {
// either
printf("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM");
// or
fputs("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM", stdout);
}
fflush(stdout);
return 0;
}
둘 다 gcc -Wall -O0
. 시간은를 사용하여 측정됩니다 time ./a.out > /dev/null
. 다음은 일반적인 실행의 결과입니다 (5 번 실행했으며 모든 결과는 0.002 초 이내입니다).
에 대한 printf()
변형 :
real 0m0.416s
user 0m0.384s
sys 0m0.033s
에 대한 fputs()
변형 :
real 0m0.297s
user 0m0.265s
sys 0m0.032s
이 효과는 문자열 이 매우 긴 경우 증폭됩니다 .
#include <stdio.h>
#define STR "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
#define STR2 STR STR
#define STR4 STR2 STR2
#define STR8 STR4 STR4
#define STR16 STR8 STR8
#define STR32 STR16 STR16
#define STR64 STR32 STR32
#define STR128 STR64 STR64
#define STR256 STR128 STR128
#define STR512 STR256 STR256
#define STR1024 STR512 STR512
int main() {
int count = 10000000;
while(count--) {
// either
printf(STR1024);
// or
fputs(STR1024, stdout);
}
fflush(stdout);
return 0;
}
를 들어 printf()
변형 (세 번, 실제 플러스 / 마이너스 1.5 초를 실행) :
real 0m39.259s
user 0m34.445s
sys 0m4.839s
를 들어 fputs()
변형 (세 번, 실제 플러스 / 마이너스 0.2 초를 실행) :
real 0m12.726s
user 0m8.152s
sys 0m4.581s
참고 : 어셈블리 GCC에 의해 생성 된 검사 후, 그 GCC는 최적화 실현 fputs()
에 전화 fwrite()
도 함께 전화를 -O0
. ( printf()
호출은 변경되지 않습니다.) 컴파일러 fwrite()
가 컴파일 시간에 문자열 길이를 계산하기 때문에 이것이 내 테스트를 무효화할지 여부는 확실하지 않습니다 .
printf("Hello World!")
인 하지 와 동일puts("Hello World!")
.puts()
추가합니다'\n'
. 대신 비교printf("abc")
에fputs("abc", stdout)