2017-02-08 3 views
-3

Ich schrieb ursprünglich dieses Programm in Java mit der Integer.toBinaryString und dann mit dem Drucker Writer, um die Ergebnisse in eine Datei schreiben. Dieses Programm listet alle Binärkombinationen im angegebenen Exponenten auf (in diesem Fall 16 Bit).C++ - Programm läuft viel langsamer als fast identisch Java-Programm

package binary; 

import java.io.FileNotFoundException; 
import java.io.PrintWriter; 
import java.util.logging.Level; 
import java.util.logging.Logger; 


public class BINARY { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 

    try (PrintWriter myFile = new PrintWriter("myThing.txt")) { 
     for (int i = 0; i < Math.pow(2, 16); i++) { // Iterates over 16 bits 
      myFile.println(Integer.toBinaryString(i)); 
     } 
     myFile.close(); 
    } catch (FileNotFoundException ex) { 
     Logger.getLogger(BINARY.class.getName()).log(Level.SEVERE, null, ex); // standard execption handler added by NetBeans IDE 

    } 

} 

}

Das Programm in C++ geschrieben ist, in viel einer ähnlichen Art und Weise geschrieben, aber mit einem cin < < n, wobei n die Leistung wird an die Basis 2 angehoben wird, wie C++ erfordert compilation Das Hinzufügen einer Schnittstelle ermöglicht daher ein schnelleres Testen (ohne das cin < < n; Konstrukt, Leistung ist sehr ähnlich).

#include <iostream> 
#include <fstream> 
#include <bitset> 
#include <string> 
#include <cmath> 

using namespace std; 

int binary(int n) { 
    int remainder, binaryNumber = 0, i = 1, step = 1; 
    while (n != 0) 
    { 
     remainder = n % 2; 
     //cout << "Step " << step++ << ": " << n << "/2, Remainder = " << remainder << ", Quotient = " << n/2 << endl; 
     n /= 2; 
     binaryNumber += remainder*i; 
     i *= 10; 
    } 
    return binaryNumber; 
} 

int main() 
{ 
    int n; 
    cout << "Enter the number of bits" << endl; 
    cin >> n; 
    cin.ignore(); 
    ofstream myFile; 
    myFile.open("output64.txt"); 
    cout << "Listing all bit combinations. This may take a while. Please wait." << endl; 
    for (int i = 0; i < pow(2, n); i++) 
    { 
     myFile << binary(i) << "\n"; 
     cout << "Number of iterations = " << i << endl; 
    } 
    myFile.close(); 
} 

Das Programm in Java ist in der Regel 16 Bits in weniger als einer Sekunde abgeschlossen. C++ benötigt jedoch einige Sekunden (10-15), um alle Binärziffern zu verarbeiten. Dies scheint nicht sinnvoll zu sein, da C++ keine virtuelle Maschine benötigt, um Bytecode auszuführen, und wird direkt in Maschinencode oder zumindest Objektcode für das Betriebssystem in Maschinencode übersetzt, so sollte es schneller sein, wenn überhaupt. Jeder hat eine mögliche Erklärung? std :: bitset <>() wurde ebenfalls vorher verwendet und wirkte in ähnlicher Weise leistungsmäßig. Ich habe versucht, den Binärkonverter wegzulassen und myFile durch cout ersetzt, aber die Leistung ändert sich nicht. Immer noch ~ 5000 Iterationen/Sek.

+0

Übersetzungsoptionen, Optimierungsstufe? –

+7

Diese scheinen nicht das gleiche zu tun. – chrylis

+0

Siehe http://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio – samgak

Antwort

-1

Das Hauptproblem ist mit Eingabedaten IO, nicht im Zusammenhang mit C++ Rechnergeschwindigkeit. Versuchen Sie diese beiden Teile zu trennen: IO + Berechnung. Und eine ClockWatch-Variable zum Zählen der Start-/Endzeit haben.

Verwandte Themen