2017-11-02 13 views
-6

나는 C++에서 Javascript보다 콘솔에 인쇄하는 것이 더 오래 걸리는 것처럼 보였지만, 나는 그 반대를 기대했을 것입니다. 나는이 JS와 C 두 fizzbuzz 테스트 ++ 생성 : 왜 C++ 콘솔에 인쇄하는 것보다 자바 스크립트 콘솔에 인쇄하는 것이 더 빠릅니까?

window.onload = function() 
{ 
    console.time("test"); 

    for(var i = 0; i < 10001; i++) 
    { 

     if(i % 3 == 0 && i % 5 == 0) 
     {    
      console.log(i + " -- fizzbuzz \n"); 
     } 
     else if(i % 3 == 0) 
     { 
      console.log(i + " -- fizz \n"); 
     } 
     else if(i % 5 == 0) 
     { 
      console.log(i + " -- buzz \n"); 
     }     
    } 

    console.timeEnd("test"); 
} 

JS

#include "stdafx.h" 
#include <cstdio> 
#include <ctime> 

int main() 
{ 

std::clock_t start; 
double duration; 

start = std::clock(); 

for (int i = 0; i < 10001; i++) 
{ 
    if (i % 3 == 0 && i % 5 == 0) 
    { 
     printf("%d -- fizzbuzz \n", i); 
    } 
    else if (i % 3 == 0) 
    { 
     printf("%d -- fizz \n", i); 
    } 
    else if (i % 5 == 0) 
    { 
     printf("%d buzz \n", i); 
    } 
} 

duration = ((std::clock() - start)/(double)CLOCKS_PER_SEC); 

printf("duration: %f \n", duration); 

std::getchar(); 

return 0; 
} 

결과

JS

012,351,641 C++

2017ms 2149ms 2357ms

C++와 같은 컴파일 된 언어 해석보다 느리게 ~ 4 번을 수행 왜 아무도 설명 할 수 약하게 입력 된 C++

502.36ms

492.54ms 498.77ms Javascript와 같은 언어? 테스트 진행 방법에 문제가 있다는 것을 알고 있지만, 문제가 무엇인지 궁금합니다.

+1

어떻게 컴파일하나요? 최적화를 활성화하십시오. –

+1

확실한 질문이 있습니까? 최적화를 사용하여 컴파일 했습니까? – vu1p3n0x

+1

공정하게하려면 자바 스크립트 케이스보다 C++ 케이스에서 하나 더 반복해야합니다. –

답변

1

두 가지 환경에서 테스트하고 있습니다. 공정한 테스트를 위해 동일한 환경 (동일한 호스트, 2GHz AMD A10-6800K 프로세서, cat /proc/cpuinfo으로보고 됨)으로 테스트하기로 결정했습니다.

Javascrtipt - 리눅스에서 bash 프롬프트에서 실행되는 node 바이너리 버전 0.10.25 사용 . 결과는 약 83ms 일관되었습니다. 나는 window.onload 래퍼를 제거해야만했다. 그렇지 않으면 그대로 있던 코드였다.

C++ - 컴파일하기 위해 stdafx.h을 제거해야했습니다. 불필요한 전화 인 getchar()도 삭제했습니다. 나는 g ++ 4.8.4로 기본값으로 컴파일하고 bash 프롬프트에서 다시 실행했다. 결과는 10ms에서 20ms 사이에서 다양합니다.

표준 출력을 파일로 리디렉션하면 Javascript가 42ms에서 실행되고 C++은 1ms가 걸렸습니다.

이 유형의 작업 부하에 대해 컴파일 된 원시 바이너리 컴파일 시간과 Just-In-Time 컴파일 언어를 비교할 때 기대할 수있는 결과 범위는 어느 것입니까? 그러나 예제에서와 같이 코드가 I/O가 무거울 때는 차이가 거의 무효화되고 다른 I/O 하위 시스템에서 테스트하면 I/O가 더 빠른 하위 시스템이 효율성에 관계없이 승리합니다 나머지 코드는

C++에서 관찰 한 2000 밀리 초 결과는 사용중인 콘솔 (Windows 기본 CMD.EXE?)에 연결되어있어 표준 출력 처리에서 그리 효율적이지 않습니다.

strace 참고로, 필자의 테스트 I/O에서 두 경우 모두 한 줄에 하나씩 write()을 반복적으로 호출했음을 확인했습니다. 예를 들어 버퍼링 중이었고 다른 버퍼링이 버퍼링되지 않은 경우 나머지 코드에서 속도 차이를 없애기에 충분히 큰 차이를 만들 수있었습니다.

+0

Windows 10에서 실행하고 콘솔에서 실행하든 VS IDE에서 실행하든 100ms를 얻습니다. OP가 뭔가 잘못하고 있어요. –

+0

g ++를 사용하여 -O3 플래그를 사용하여 다시 컴파일하고 150 밀리 초로 내려갔습니다. –