Wie kann das wahrscheinlich/unwahrscheinlich-Makros in Linux-kernel arbeiten, und was ist Ihr nutzen?

Ich habe gegraben durch einige Teile des Linux-Kernels, und fand Aufrufe wie diese:

if (unlikely(fd < 0))
{
    /* Do something */
}

oder

if (likely(!err))
{
    /* Do something */
}

Fand ich die definition von Ihnen:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)

Ich weiß, Sie sind für die Optimierung, aber wie funktionieren Sie? Und wie viel Leistung/Größe verringern kann erwartet werden, aus mit Ihnen? Und lohnt sich der Aufwand (und Verlust der Portabilität wahrscheinlich) zumindest in Engpass-code (im userspace, natürlich).

  • Das ist wirklich nicht spezifisch für den Linux-kernel oder über Makros, aber eine compiler-Optimierung. Sollte dies retagged zu reflektieren?
  • Das Papier Was jeder Programmierer wissen sollte, über das Gedächtnis (S. 57) enthält eine ausführliche Erläuterung.
  • Nach der kernelnewbies FAQ (und die neueste 3.11 kernel-source), die makro-Definitionen sind etwas anders jetzt: #define rechnen(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) ich denke, dies fügt ein wenig mehr zur Verwirrung!? 🙂 Ich verstehe nicht die Notwendigkeit für doppelte NICHT (<code>!!</code>).
  • siehe auch BOOST_LIKELY
  • Verwandte: eine benchmark, die auf die Verwendung von __builtin_expect auf eine andere Frage.
  • Es gibt keine Portabilität Problem. Sie können trivial Dinge tun, wie #define likely(x) (x) und #define unlikely(x) (x) auf Plattformen, die keine Unterstützung für diese Art des hinting.

InformationsquelleAutor terminus | 2008-09-20
Schreibe einen Kommentar