Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mi 04.02.09 04:16 
Hi,

ich habe ein mittelgroßes performance problem bei meinem Programm..

Ich habe bisher meine funktionen immer ganz normal im header deklariert und in der cpp datei dann implementiert, nur jetzt habe ich das problem, dass hierbei scheinbar ein gewisser overhad entsteht wenn man die funktion extrem oft benutzt..

Ich rufe eine funktion z.B. mehrere millionen mal auf und habe dabei die geschwindigkeit gemessen. Die variante wo die implementation in der cpp datei steht braucht ca. 300ms länger als die, wo es im Header implementiert ist (inline).

Gut, man kann jetzt sagen "300ms.. ist doch okay..?", allerdings brauche ich jede millisekunde :(

Das problem an der geschichte ist jetzt, ich möchte ungern alle möglichen funktionen im header implementieren.. bei einzeilern is das ja kein thema, aber bei größeren funktionen wird das zum einen unübersichtlich und zum anderen wird jedesmal alles neu compiliert nur weil man eine kleinigkeit ändert..

Gibt es evtl irgendeine möglichkeit die funktionen nach wie vor in der cpp datei zu implementieren, aber trotzdem die performance von inline funktionen zu bekommen? Also so vonwegen das der compiler (GCC 4.1) die funktionen selbst in inline "verwandelt"? Allerdings müßte er dann ja beim einbinden des headers wissen wo (in welcher cpp datei) sie definiert ist.. geht das? (Bei mir heißen cpp und header immer gleich)

Ich weiß die frage ist evtl merkwürdig *g*

Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.02.09 05:18 
Hast du es denn einmal mit dem Schlüsselwort inline probiert?

Funktionieren sollte das dann auch bei im Header definierten Routinen. Aber IMHO nicht unbedingt bei Aufrufen aus anderen Teilen des Programms, je nach Compiler. In der selben Datei sollte inline mit dem Schlüsselwort inline aber auf jeden Fall funktionieren, auch bei einer Deklaration in der Header-Datei und Implementierung in der Cpp-Datei.

inline wird einfach vor die Deklaration als Direktive geschrieben.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 04.02.09 07:33 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
inline wird einfach vor die Deklaration als Direktive geschrieben.

Soweit ich weiss muss man inline in der Definition (CPP) angeben und nicht in der Deklaration (H).
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.02.09 13:14 
Hmm, ich hab gerade mal geschaut, also das sieht für mich nicht so aus:
fara.cs.uni-potsdam....aqs&faq=ODR#Answ hat folgendes geschrieben:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
// Header.h
    #ifndef HEADER_H
    #define HEADER_H
    // OK. Inline-Funktionen dürfen mehrfach definiert werden,
    // solange alle Definitionen gleich sind.
    inline void Func()
    {
        // Do something
    }
und
www.c-plusplus.de/fo...var-p-is-759322.html hat folgendes geschrieben:
Antwort: Wenn du willst, dass deine Funktion inline expandiert werden kann, dann definiere sie auf eine dieser Arten:
[...]
3) Funktion in einem Header (egal ob Member oder nicht), die mit dem inline-Schlüsselwort gekennzeichnet ist
Und schlucken tuts der Compiler, auch wenn ich mir den generierten Code jetzt nicht angeschaut habe. ;-)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 04.02.09 13:28 
[9.9] www.parashift.com/c+...nline-functions.html

Geht wohl beides, best practice ist jedoch das inline im CPP. Hmmm, interessanter Text unter NOTE.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.02.09 13:34 
user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
Hmmm, interessanter Text unter NOTE.
Das ist schon richtig, aber jeder weiß was gemeint ist, und das ist das wichtige.

Man kann ja z.B. auch eine Routine ganz ohne Deklaration an anderer Stelle für lokale Benutzung definieren, dann hat man gar keine getrennte Deklaration.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mi 04.02.09 14:04 
user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
Das problem an der geschichte ist jetzt, ich möchte ungern alle möglichen funktionen im header implementieren..

Gibt es evtl irgendeine möglichkeit die funktionen nach wie vor in der cpp datei zu implementieren, aber trotzdem die performance von inline funktionen zu bekommen?
Nein, das geht so nicht.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert