Linux vs Windows



  • Hallo ihrs,

    irgendwie ist mir grad aufgefallen, das ich noch eine frage habe.
    mein programm läuft unter Visual C++ in 2 minuten ab.
    unter linux (suse 10.0) braucht es aber 20 minuten.

    gibt es dafür einen grund? z.b. langsamere standard libraries?

    ich danke nocheinmal,
    liebe grüße,
    Sebastian



  • Zeig doch mal dein programm



  • Hallo,

    ich würde gerne das programm zeigen...aber so 100pro kann ichs nicht machen.
    aber hier ein kleiner teil davon...der der so zeitkonsumierend ist:

    for(i=0;i<size;i++)
    	for(int k=0;k<i;k++) {
    		for(int n=0;n<size;n++){
    			if( i!=n && k!=n ){
    				if( _graph.get_edge(i,n)>0 && _graph.get_edge(k,n)>0 )
    					_comm_neighbors[i][k]++;
    				else if ( _graph.get_edge(i,n)>0 || _graph.get_edge(k,n)>0 )
    					_non_comm_neighbors[i][k]++;
    			}
    		}
    

    _graph.get_edge(i,j) liefert einen integer adjazenz wert einer kante im graphen, und greift dabei auf eine matrix (typ: vector of vector of short) per indices zu.

    _comm_neighbors[i][j] ist eine matrix (typ: vector of vector of short) und wird vorher mit 0 initialisiert.

    das programm läuft auf einer problemgröße 5575 bei mir auf dem PC in Visual C++ in 1,5h ... am Uni Suse 10.0 Rechner in 15h

    jetzt vielleicht eine idee?
    liebe grüße,
    Sebastian



  • hast bei suse nicht mit -O3 compiliert.



  • Hallo,

    mmhh...davon hab ich noch nie was gehört um ehrlich zu sein.
    ich hab einfach mit flag -o kompiliert.
    bringt denn -o3 viel mehr? oder was ist der unterschied?
    dank,
    gruß,
    Sebastian



  • sebastian_v_b schrieb:

    Hallo,

    mmhh...davon hab ich noch nie was gehört um ehrlich zu sein.
    ich hab einfach mit flag -o kompiliert.
    bringt denn -o3 viel mehr? oder was ist der unterschied?
    dank,
    gruß,
    Sebastian

    -O oder -o?

    http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Optimize-Options.html#Optimize-Options

    -O3
    Optimize yet more. -O3 turns on all optimizations specified by -O2 and also turns on the -finline-functions, -funswitch-loops and -fgcse-after-reload options.

    du musst auf jeden fall zulassen, daß inline-funktionen auch inline werden. aber das haste ja schon, wenn du -O benutzt hast. hättest du das nicht, würde es so einen riesen-faktor der langsamkeit begründen können.



  • Man!! mal wieder den nagel auf den kopf getroffen!
    ich habe tatsächlich immer -o benutz statt -O ... geschweige denn -O3

    nun bekomme ich aber ganz schreckliche compiler fehler, die ich vorher nicht hatte:

    collect2: ld terminated with signal 11 [Speicherzugriffsfehler]
    graphTest(.text+0x40b8): In function `Graph::delete_vertex(int)':
    : multiple definition of `Graph::delete_vertex(int)'
    graph.o(.text+0x3f78): first defined here
    graphTest(.text+0x3550): In function `Graph::get_vertex_name(int) const':
    : multiple definition of `Graph::get_vertex_name(int) const'
    graph.o(.text+0x3410): first defined here
    graphTest(.text+0x3766): In function `Graph::add_vertex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)':
    : multiple definition of `Graph::add_vertex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'
    graph.o(.text+0x3626): first defined here
    graphTest(.text+0x3360): In function `Graph::get_edge_weight(int, int) const':
    : multiple definition of `Graph::get_edge_weight(int, int) const'
    graph.o(.text+0x3220): first defined here
    graphTest(.text+0x3ec): In function `Graph::Graph[in-charge](int, double)':
    : multiple definition of `Graph::Graph[in-charge](int, double)'
    graph.o(.text+0x2ac): first defined here
    

    vielleicht hat das was mit dem makefile zu tun??
    mein makefile sieht wie folgt aus:

    ClusterEditing: problemKernelEditOperationsTest.cpp problemKernelEditOperations.o editGraphTest.cpp editGraph.o graphTest.cpp graph.o graphException.o
    	g++ graphException.o graph.o -O graphTest -idirafter . graphTest.cpp
    	g++ graphException.o graph.o editGraph.o -O editGraphTest -idirafter . editGraphTest.cpp
    	g++ graphException.o graph.o editGraph.o problemKernelEditOperations.o -O problemKernelEditOperationsTest -idirafter . problemKernelEditOperationsTest.cpp
    
    problemKernelEditOperations.o: problemKernelEditOperations.cpp problemKernel.h editGraph.o
    	g++ -c -idirafter . problemKernelEditOperations.cpp
    
    editGraph.o: graph.o editGraph.cpp editGraph.h
    	g++ -c -idirafter . editGraph.cpp	
    
    graph.o: graph.cpp graph.h graphException.o
    	g++ -c -idirafter . graph.cpp
    
    graphException.o: graphException.cpp graphException.h
    	g++ -c -idirafter . graphException.cpp
    

    muss man beim kompilieren mit -O irgendetwas beachten??
    Dank,
    Sebastian



  • Hast du jetzt -o weggelassen, oder was?

    Ein korrekter Aufruf sähe so aus:

    g++ -O3 -o main main.cpp
    

    -o brauchst du trotzdem, um salopp zu sagen: "Hey, mach mir mal ne binary"
    -O3 brauchst du, um zu sagen: "Hey, mach das Programm auch gaaanz schnell"

    -O2 tut's im Übrigen in den meisten Fällen auf. Erst kürzlich war bei mir O3 langsamer als O2, schräge sache.



  • Hallo,

    vielen Dank...natürlich hab ich einfach -o weggelassen...ich Hirnie.
    leider läuft es immer noch nicht schneller, weder mit O2 noch O3.
    das problem muss also ein anderes sein.

    habt ihr noch irgendwelche ideen?

    liebe grüße,
    Sebastian



  • ist der code ansonsten exakt der gleiche wie auf der winbox?
    benutzt du irgendwelche externen libraries, die unter linux vielleicht grottig programmiert sind?



  • ich benutze exakt das gleiche programm, mit den exakt gleichen libraries.
    also nur die standard library.
    ich find das ganze auch sehr merkwürdig, vorallem weil der linux rechner mehr speicher hat und nen schnelleren prozessor!!!
    der prozess läuft auch bei voller auslastung...



  • Irgendwoher muss der Unterschied ja kommen.... welche Version vom g++ hast du denn?

    Denn bei mir (g++ 3.3.6) und Slackware 10.2 gibt's im Vergleich zu Win2k minimale (wenn überhaupt) Unterschiede. Hast du bei Suse noch was im Hintergrund laufen?



  • Was sagt denn

    ps aux
    

    ?



  • Nabend,

    bevor das Raten munter weitergeht schlage ich vor, mal einen Profiler einzusetzen
    und zu schauen, wo genau die Zeit haengen bleibt. Dann kann man weitersehen.

    gruss
    v R



  • meine g++ version ist 3.3.1
    die unterschiede sind da...schön das du sie nicht hast 🙂

    so ein profiling wäre cool...vielleicht könnte noch jemand posten, wie man das macht....danke 🙂


Log in to reply