Frage

Auf dem Embedded-Gerät arbeite ich an, ist die Startzeit ein wichtiges Thema. Die gesamte Anwendung besteht aus mehreren ausführbaren Dateien, die einen Satz von Bibliotheken. Da der Platz in FLASH-Speicher begrenzt ist, wir möchten gemeinsam genutzte Bibliotheken verwenden.

Die Anwendung workes wie immer, wenn kompiliert und mit gemeinsam genutzten Bibliotheken und die Menge des FLASH-Speicher verbunden ist, wie erwartet reduziert. Der Unterschied zu der Version, die auf statische Libs verbunden ist, ist, dass die Startzeit der Anwendung über 20s länger ist, und ich habe keine Ahnung, warum.

Die Anwendung läuft auf einem ARM9 CPU bei 180 MHz mit Linux 2.6.17 OS, 16 MB FLASH (JFFS File System) und 32 MB RAM.

War es hilfreich?

Lösung

Bacause Shared Libraries müssen zur Laufzeit verknüpft werden, in der Regel durch dlopen () oder etwas ähnliches. Es gibt nicht so Schritt für statische Bibliotheken.

Edit: einige weitere Details. dlopen hat folgende Aufgaben zu erfüllen.

  • Finden Sie die gemeinsame Bibliothek
  • Laden in den Speicher
  • laden rekursiv alle Abhängigkeiten (und deren Abhängigkeiten ....)
  • Lösen Sie alle Symbole

Dies erfordert eine ganze Reihe von IO-Operationen zu erreichen.

In einem statisch gelinkte Programm all oben bei der Kompilierung durchgeführt wird, nicht die Laufzeit. Deshalb ist es viel schneller ein statisch gelinkte Programm zu laden.

In Ihrem Fall wird die Differenz durch die relativ langsame Hardware übertrieben ist Ihr Code muss laufen.

Andere Tipps

Dies ist ein schönes Beispiel für den klassischen Kompromiss aus Geschwindigkeit und Raum.

Sie können statisch verknüpfen alle ausführbaren Dateien, so dass sie schneller sind, aber dann werden sie mehr Platz in Anspruch nehmen

oder

Sie haben können Bibliotheken gemeinsam genutzt, das weniger Platz in Anspruch nehmen, sondern auch mehr Zeit zu laden.

So entscheiden, was Sie opfern wollen.

Es gibt viele Faktoren für diese Differenz (O, Compiler usw.), aber eine gute Liste der Gründe zu finden sind hier . Grundsätzlich gemeinsam genutzte Bibliotheken wurden aus Platzgründen und viel von der „Magie“ geschaffen beteiligt, damit sie Arbeit nimmt eine Leistung getroffen.

(Als historische Notiz der ursprüngliche Netscape Navigator auf Linux / Unix wurde ein statisch großes Fett ausführbare verknüpft).

Dies kann andere mit ähnlichen Problemen helfen:

Der Grund, warum Inbetriebnahme so lange gedauert hat, in meinem Fall war, dass die Standardeinstellung des GCC alle Symbole in einer Bibliothek zu exportieren ist. Eine große Verbesserung ist eine Compiler-Einstellung "-fvisibility = hidden" zu setzen.

Alle Symbole, die die lib haben den Export hat mit der Aussage ergänzt werden

__attribute__ ((visibility("default")))

finden Sie unter gcc Wiki
und die sehr feinen Artikel wie gemeinsam genutzte Bibliotheken schreiben

Ok, ich habe jetzt gelernt, dass die Nutzung von Shared Libraries hat es disadvatages ist in Bezug auf Geschwindigkeit. Ich fand diesen Artikel über dynamische Verknüpfung und Laden enlighting. Der Ladevorgang scheint viel längere zu sein, als ich erwartet habe.

Interessante .. Regel Zeit für eine gemeinsame Bibliothek geladen ist unmerklich von einer Fett-Anwendung, die statisch verknüpft ist. So kann ich nur vermuten, dass das System entweder sehr langsam ist, eine Bibliothek aus dem Flash-Speicher zu laden, oder die Bibliothek, die geladen wird, in irgendeiner Weise überprüft wird (zB NET-Anwendungen eine Prüfsumme für alle geladenen DLLs ausgeführt werden, die Startzeit deutlich verringert wird in manche Fälle). Es könnte sein, dass die gemeinsam genutzten Bibliotheken nach Bedarf geladen werden, und entladen danach, welche ein Konfigurationsproblem hinweisen könnten.

Also, sorry ich kann nicht helfen, sagen, warum, aber ich denke, sein ein Problem mit Ihrem ARM-Gerät / O. Haben Sie den Startcode versucht instrumentiert oder statische Verknüpfung mit 1 der am häufigsten verwendeten Bibliotheken, um zu sehen, ob das einen großen Unterschied macht. setzt auch die gemeinsam genutzten Bibliotheken im selben Verzeichnis wie die App, die Zeit zu reduzieren, die FS für die lib Reflektor zu suchen.

Eine Option, die mir klar scheint, ist statisch auf die verschiedenen Programme verbinden alle in einem einzigen binären. So können Sie auch weiterhin so viel Code wie möglich teilen (wahrscheinlich mehr als zuvor), aber Sie werden auch den Aufwand des dynamischen Linkers vermeiden und den Raum mit dem dynamischen Linker auf dem System speichern überhaupt.

Es ist ziemlich einfach, mehrere ausführbare Dateien in den gleichen zu kombinieren, die Sie normalerweise nur argv untersuchen und entscheiden, welche Routine auf dieser Grundlage zu nennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top