Ich habe einen großen Unterschied in der Leistung meines C-Programms festgestellt, abhängig vom Flag -fPIC. Wenn ich es verwende, ist mein Programm etwa 30% langsamer als ohne es. Ich vergleiche es mit einem Lua-Programm, das eine C-Funktion aufruft (wo die ganze schwere Berechnung durchgeführt wird). Zuerst habe ich ein gemeinsames Objekt mit der C-Funktion erstellt, also musste ich das Flag -fPIC verwenden. Die Leistung ist dem C-Code mit -fPIC-Flag sehr ähnlich. So, jetzt habe ich versucht, dasselbe ohne die .so: Ich rief Lua von C:
%Vor%Aber hier ist die Leistung gleich, egal ob ich das Flag -fPIC verwende oder nicht (und dasselbe wie die Vorgehensweise mit .so). Ich erwartete eine Verbesserung ohne die -fPIC-Flagge ... Irgendeinen Ratschlag, wie ich es weiter untersuchen könnte? Ist der zweite Ansatz ohnehin ein positionsunabhängiger Code und deshalb ist die Performance ähnlich? Vielen Dank!
Weitere Informationen, wie vom Kommentar vorgeschlagen: Ich benutze das -O3-Flag, gcc 4.7.2, Ubuntu 12.04.2, x86_64. Ja, ich war ziemlich überrascht von dem großen Overhead ... Mein Programm berechnet das Mandelbrot-Fraktal. Es gibt also zwei Schleifen, die über x und y iterieren, und die Funktion, die ich in C habe, ist isMandelbrot: Sie nimmt die Anzahl der Iterationen und gibt bool zurück: gehört zu Mandelbrot oder nicht. Ich benutze das gemeinsame Objekt mit 'require'.
Ich denke, der Code, auf dem Sie laufen, ist x86. Diese Plattform weist Leistungsprobleme mit -fPIC auf, wobei für den Speicherort jeder importierten Funktion der lokale EIP benötigt wird. Der Code, um dies zu tun, fügt der Funktion einen kleinen Overhead hinzu. Leider ist lua voll von sehr kleinen Funktionen und erhöht den relativen Overhead.
Auf x64 -fPIC hat diesen Overhead nicht.
Ok, es gibt fast keinen Unterschied, wenn man das c-Programm mit c-Programm oder mit lua aufruft, aber jedesmal, wenn das c-Programm erstellt wird, macht man wer; e unabhängiges Programm, mit allen System-Headern und dann, nachdem es fertig ist, was tut, meldet es Wert zurück. Mein Punkt ist, dass das Problem nicht "Aufruf" -Funktion ist, sondern wie viele und wie schnell, weil es viel zu tun gibt, nachdem Sie nur Programm aufgerufen haben.
o3 Optimierungs-Flag ist nicht sehr gesund, also wenn du das einmal getan hast, möchtest du vielleicht auch -Ofast versuchen, einfach nicht -Os benutzen, es könnte nur schlimmere Sachen machen ...
Der einfachste Weg, um die Leistung zu verbessern, besteht darin, nur den c-Code zu optimieren. Hier gibt es eine ganze Reihe von Flags und eine Menge Dokumentation über die unter GCC-Compiler. Seien Sie sich bewusst, dass nicht alle von ihnen sicher sind und nicht alle von ihnen wirklich benötigt werden, also analysieren Sie Ihren Code und wählen Sie nur das, was Sie brauchen.
Zweite Möglichkeit der Optimierung Ihr Code wird als etwas schwierig angesehen. Vielleicht möchten Sie ein C-Programm starten, während Sie Lua-Skript starten und dann Informationen in Runtime (parallel) austauschen, so dass Sie nicht das ganze Programm aufrufen müssen, um jedes Mal anzuzeigen, wenn Sie es aufrufen
dritte, härteste Weise, lassen Sie Ihren C-Code erstellen n Threads, wobei n & lt; = Prozessor-Logik-Kerne, so dass sie unabhängig arbeiten können.
auch wenn es Ihnen nichts ausmacht, C / C ++ Code ist gut in Mathe Dinge, aber es gibt bessere Sprachen, wo Sie mehr Leistung, wie Fortran, APL, Matlab, Haskel, R bekommen können, oder wenn Sie verrückt genug sind und Sie haben gute Kenntnisse mathematischer Probleme - GPU statt CPU verwenden - & gt; Shader Language, ich habe sie auch zu irgendwelchen komischen Sachen benutzt, sogar nicht in der Nähe von Graphics, aber es funktioniert für mich.
Tags und Links c gcc performance lua