2017-11-02 1 views
-6

Ich habe bemerkt, dass es länger dauert, in C++ auf die Konsole zu drucken als in Javascript, aber ich hätte das Gegenteil erwartet. Ich habe diese beiden fizzbuzz Tests in JS und C++:Warum ist es schneller, an die JavaScript-Konsole zu drucken als an die C++ - Konsole zu drucken?

JS

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"); 
} 

C++

#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; 
} 

Ergebnisse

JS

012.351.

492.54ms 498.77ms 502.36ms

C++

2017ms 2149ms 2357ms

Kann mir jemand erklären, warum eine kompilierte Sprache wie C++ funktionieren würde ~ 4 mal langsamer als eine interpretierte, schwach typisierten Sprache wie Javascript? Mir ist klar, dass es wahrscheinlich ein Problem mit der Durchführung des Tests gibt, aber ich bin nur neugierig auf das Problem.

+1

Wie kompilieren Sie? Stellen Sie sicher, dass Optimierungen aktiviert sind. –

+1

offensichtliche Frage, haben Sie mit aktivierten Optimierungen kompiliert? – vu1p3n0x

+1

Um fair zu sein, haben Sie eine weitere Iteration in der C++ - Fall als in der Javascript-Fall. –

Antwort

1

Sie testen es in zwei verschiedenen Umgebungen. Um es einen fairen Test zu machen, habe ich beschlossen, es in ähnlichen Umgebungen zu testen (gleiche Host, 2 GHz AMD A10-6800K Prozessor wie cat /proc/cpuinfo berichtete):

Javascrtipt - mit node binärer Version 0.10.25 auf Linux ausgeführt von Bash-Eingabeaufforderung . Die Ergebnisse waren konsistent um 83 ms. Ich musste window.onload Wrapper entfernen, sonst war es dein Code wie er ist.

C++ - Ich musste die Aufnahme von stdafx.h entfernen, um es zu kompilieren. Ich entfernte auch den Anruf zu getchar(), wie es unnötig war. Ich kompilierte mit g ++ 4.8.4 mit Standardeinstellungen und wieder lief es von bash prompt. Die Ergebnisse variierten zwischen 10 ms und 20 ms.

Wenn ich die Standardausgabe in eine Datei umgeleitet hat, wurde Javascript in 42ms ausgeführt, während C++ 1 ms dauerte.

Dieses Ergebnis liegt im Bereich dessen, was man erwarten würde, wenn man eine native binäre kompilierte Version mit just-in-time kompilierten Sprachen für diese Art von Arbeitslast vergleicht. Beachten Sie jedoch, dass, wenn der Code wie in Ihrem Beispiel I/O-lastig ist, der Unterschied weitgehend negiert wird und wenn Sie in verschiedenen I/O-Subsystemen testen, wird der mit dem schnelleren I/O ungeachtet der Effizienz gewinnen vom Rest des Codes.

Ich glaube, die 2000 ms Größenordnung Ergebnis, das Sie beobachten in C++ ist mit der Konsole verbunden, die Sie verwenden (Windows-Standard CMD.EXE?) Nicht sehr effizient mit der Standardausgabeverarbeitung.

Hinweis, dass ich mit strace verifiziert habe, dass in beiden Fällen in meinem Test I/O in ähnlicher Weise durchgeführt wurde - wiederholte Aufrufe an write() - eins pro Zeile. Wenn einer zum Beispiel puffern würde und der andere nicht, hätte er einen Unterschied machen können, der groß genug ist, um die Geschwindigkeitsunterschiede im Rest des Codes zu negieren.

+0

Ich führe es auf Windows 10 und bekomme 100 ms, egal ob von der Konsole oder von der VS IDE. Das OP macht etwas falsch. –

+0

Ich habe g ++ mit dem -O3-Flag neu kompiliert und habe es auf 150 ms heruntergesetzt. –

Verwandte Themen