58 Stimmen

RAM-Drive zum Kompilieren - gibt es so etwas?

Eine Antwort (siehe unten) auf eine der Fragen hier auf Stack Overflow brachte mich auf die Idee für ein großartiges kleines Stück Software, das für Programmierer überall von unschätzbarem Wert sein könnte.

Ich stelle mir eine RAM-Drive-Software vor, aber mit einem entscheidenden Unterschied: Sie würde einen echten Ordner auf meiner Festplatte spiegeln. Genauer gesagt - den Ordner, der das Projekt enthält, an dem ich gerade arbeite. Auf diese Weise würden alle Builds fast sofort erfolgen (oder zumindest um einige Größenordnungen schneller). Das RAM-Laufwerk würde seinen Inhalt im Hintergrund mit dem Festplattenlaufwerk synchronisieren und dabei nur ungenutzte Ressourcen verwenden.

Eine schnelle Google-Suche ergab nichts, aber vielleicht weiß ich einfach nicht, wie man googelt. Vielleicht kennt jemand eine solche Software? Vorzugsweise kostenlos, aber angemessene Gebühren wären auch OK.

Hinzugefügt: Es wurden einige Lösungen vorgeschlagen, die ich gleich zu Beginn verworfen habe. Sie lauten (in keiner bestimmten Reihenfolge):

  • Kaufen Sie ein schnelleres Festplattenlaufwerk ( SSD vielleicht oder 10K RPM). Ich möchte keine Hardware-Lösung. Software ist nicht nur potenziell billiger (Freeware, wer möchte?), sondern kann auch in Umgebungen eingesetzt werden, in denen Hardware-Modifikationen unerwünscht oder sogar unmöglich wären - beispielsweise im Büro.
  • Überlassen Sie das Zwischenspeichern dem Betriebssystem/der Festplatte - es weiß besser, wie es Ihren freien Arbeitsspeicher nutzen kann. Das Betriebssystem/die Festplatte verfügt über allgemeine Cache-Algorithmen, die alles zwischenspeichern und versuchen vorherzusagen, welche Daten in Zukunft am meisten benötigt werden. Sie haben keine Ahnung, dass für mich mein Projektordner Priorität hat. Und wie wir alle wissen, wird dort sowieso nicht viel zwischengespeichert ;)
  • Es gibt jede Menge RAM-Drives; verwenden Sie eine davon. Tut mir leid, das wäre leichtsinnig. Ich muss meine Daten immer dann auf die Festplatte zurücksynchronisieren, wenn ich ein bisschen Zeit habe. Im Falle eines Stromausfalls könnte ich es ertragen, die letzten fünf Minuten Arbeit zu verlieren, aber nicht alles seit meinem letzten Check-in.

Hinzugefügt 2: Eine Idee, die aufkam - verwenden Sie ein normales RAM-Laufwerk plus einen Hintergrund-Ordner-Synchronisierer (aber ich meine Hintergrund ). Gibt es so etwas?

Hinzugefügt 3: Interessant. Ich habe gerade ein einfaches RAM-Laufwerk bei der Arbeit ausprobiert. Die Wiederherstellungszeit sinkt von ~14 Sekunden auf ~7 Sekunden (nicht schlecht), aber die inkrementelle Erstellung dauert immer noch ~5 Sekunden - genau wie auf der HDD. Irgendwelche Ideen, warum? Es verwendet aspnet_compiler et aspnet_merge . Vielleicht machen sie etwas mit anderen temporären Dateien an anderer Stelle?

Hinzugefügt 4: Oh, eine schöne neue Reihe von Antworten! :) OK, ich habe noch ein paar Infos für alle Neinsager :)

Einer der Hauptgründe für diese Idee ist nicht die oben erwähnte Software (14 Sekunden Bauzeit), sondern eine andere, auf die ich damals keinen Zugriff hatte. Diese andere Anwendung hat eine 100 MB große Codebasis, und ihre vollständige Erstellung dauert etwa 5 Minuten. Ah ja, es ist in Delphi 5 Der Compiler ist also nicht allzu fortschrittlich. :) Wenn man den Quellcode auf ein RAM-Laufwerk legt, ergibt sich ein GROSSER Unterschied. Ich habe es unter eine Minute gebracht, glaube ich. Ich habe nicht nachgemessen. Also für alle, die sagen, dass das Betriebssystem Dinge besser zwischenspeichern kann - ich bin da anderer Meinung.

Verwandte Frage:

RAM-Disk zur Beschleunigung von IDE

Anmerkung zum ersten Link: Die Frage, auf die sie verweist, wurde gelöscht, weil sie ein Duplikat war. Sie fragte:

Was tun Sie, während Ihr Code kompiliert wird?

Und die Antwort von Dmitri Nesteruk die ich verlinkt habe, war:

Ich kompiliere fast augenblicklich. Das liegt zum Teil daran, dass meine Projekte klein sind, zum Teil an der Verwendung von RAM-Disks.

0 Stimmen

Warum ist eine Änderung der Hardware im Büro nicht möglich? Wir haben immer ein gewisses Budget zur Verfügung, wenn der Wert vorhanden ist. Außerdem bin ich bekannt dafür, Hardware mit meinem eigenen Geld zu kaufen, nur um meine Arbeit angenehmer zu gestalten.

2 Stimmen

In meinem Fall dauern die Builds ~15s inkrementell und ~30s vollständig. Nicht wirklich etwas, womit man den Chef überzeugen kann. Aber es wäre schön, wenn es 1s wäre :) Und ich möchte nicht mein eigenes Geld in so etwas investieren. Außerdem - es gibt viele Leute da draußen und jeder hat eine andere Geschichte. Viele haben vielleicht auch einen Nutzen davon.

4 Stimmen

Wenn ich Ihr Chef wäre, würde ich mich dafür interessieren, wie Sie die Bauzeit von 15-30 Sekunden auf 1 Sekunde reduzieren können. Jede Eine wahrnehmbare Verzögerung ist eine Gelegenheit zur Verbesserung. Die Produktivität der Entwickler wird durch jede Verzögerung direkt beeinträchtigt.

1voto

Zoredache Punkte 34350

Ich frage mich, ob man nicht so etwas wie ein Software-RAID 1 aufbauen könnte, bei dem eine physische Festplatte/Partition ein Mitglied ist und ein Stück RAM ein Mitglied ist.

Ich wette, dass man mit ein bisschen Tweaking und einer wirklich seltsamen Konfiguration Linux dazu bringen könnte, dies zu tun. Ich bin allerdings nicht davon überzeugt, dass es den Aufwand wert wäre.

1voto

Adam Hawes Punkte 5403

Was selbst auf einem Single-Core-Rechner sehr vorteilhaft sein kann, ist die Parallelverarbeitung. Festplatte E/A ist ein ziemlich großer Faktor im Bauprozess. Das Erzeugen von zwei Compiler-Instanzen pro CPU-Kern kann die Leistung tatsächlich steigern. Während eine Compiler-Instanz die E/A blockiert, kann sich die andere in der Regel auf den CPU-intensiven Teil der Kompilierung konzentrieren.

Sie müssen sich vergewissern, dass Sie über den entsprechenden Arbeitsspeicher verfügen (auf einer modernen Workstation sollte das kein Problem sein), sonst müssen Sie den Speicher auslagern, und das macht den Zweck zunichte.

Auf GNU make können Sie einfach verwenden -j[n] donde [n] ist die Anzahl der gleichzeitig zu startenden Prozesse. Vergewissern Sie sich, dass Sie Ihre Abhängigkeitsstruktur richtig haben, bevor Sie es versuchen, sonst können die Ergebnisse unvorhersehbar sein.

Ein weiteres sehr nützliches Werkzeug (in der Art der parallelen Erstellung) ist distcc . Es funktioniert sehr gut mit GCC (wenn Sie GCC oder etwas mit einer ähnlichen Befehlszeilenschnittstelle verwenden können). distcc bricht die Kompilieraufgabe auf, indem es vorgibt, der Compiler zu sein und Aufgaben auf entfernten Servern auszulösen. Sie rufen ihn auf die gleiche Weise auf wie GCC, und Sie nutzen die Option -j[n] von make, um viele distcc-Prozesse aufzurufen.

In einem meiner früheren Jobs hatten wir einen ziemlich intensiven Linux-Betriebssystemaufbau, der eine Zeit lang fast täglich durchgeführt wurde. Durch das Hinzufügen einiger dedizierter Build-Maschinen und die Installation von distcc auf einigen Workstations zur Annahme von Kompilieraufträgen konnten wir die Build-Zeiten von einem halben Tag auf unter 60 Minuten für einen kompletten OS + Userspace-Build senken.

Es gibt eine Menge anderer Tools, die das Kompilieren beschleunigen. Vielleicht möchten Sie mehr als nur die Erstellung von RAM-Disks untersuchen; etwas, das anscheinend nur sehr wenig Gewinn bringt, da das Betriebssystem das Disk-Caching mit RAM durchführt. Die Entwickler von Betriebssystemen verbringen viel Zeit damit, das Caching für die meisten Arbeitslasten richtig hinzubekommen; sie sind (kollektiv) schlauer als Sie, also würde ich nicht versuchen wollen, es besser zu machen als sie.

Wenn Sie RAM für die RAM-Disk verbrauchen, steht dem Betriebssystem weniger Arbeitsspeicher zur Verfügung, um Daten zwischenzuspeichern und Ihren Code auszuführen -> es kommt zu mehr Auslagerungen und einer schlechteren Festplattenleistung als sonst (Hinweis: Sie sollten ein Profil dieser Option erstellen, bevor Sie sie vollständig verwerfen).

1voto

dbr Punkte 158949

Es gibt viele RAMDrives, verwenden Sie eine davon. Tut mir leid, das wäre leichtsinnig.

Nur wenn Sie komplett in der RAM-Disk arbeiten, was dumm ist.

Pseudo-Shell-Skript, ramMake:

# setup locations
$ramdrive = /Volumes/ramspace
$project = $HOME/code/someproject

# ..create ram drive..

# sync project directory to RAM drive
rsync -av $project $ramdrive

# build
cd $ramdrive
make

#optional, copy the built data to the project directory:
rsync $ramdrive/build $project/build

Das heißt, Ihr Compiler kann dies möglicherweise ohne zusätzliche Skripte tun. Ändern Sie einfach Ihre Build-Ausgabe-Speicherort zu einem RAM-Disk, zum Beispiel in Xcode, es ist unter Einstellungen, Gebäude, "Place Build Products in:" und "Place Intermediate Build Files in:".

1voto

nex Punkte 21

Meine endgültige Lösung für dieses Problem ist vmtouch: https://hoytech.com/vmtouch/ Dieses Tool sperrt den aktuellen Ordner in den (Ram-)Cache und vmtouch wird als Daemon im Hintergrund ausgeführt.

sudo vmtouch -d -L ./

Legen Sie dies in die Shell rc für schnellen Zugriff:

alias cacheThis = 'sudo vmtouch -d -L ./'

Ich habe eine ganze Weile nach einem fertigen Skript gesucht, weil ich nicht viel Zeit damit verschwenden wollte, mein eigenes ramdisk-rsync-Skript zu schreiben. Ich bin mir sicher, dass ich einige Randfälle übersehen hätte, was ziemlich unangenehm wäre, wenn wichtiger Code betroffen wäre. Und ich mochte den Polling-Ansatz nie.

Vmtouch scheint die perfekte Lösung zu sein. Außerdem verschwendet es keinen Speicher, wie es eine Ramdisk mit fester Größe tut. Ich habe keinen Benchmark gemacht, weil 90% meines 1Gig Source+Build-Ordners bereits zwischengespeichert waren, aber zumindest fühlt es sich schneller an ;)

0voto

snemarch Punkte 4818

Einige Ideen, die mir spontan einfallen:

Sysinternals' verwenden Prozess-Monitor (nicht Prozess-Explorer ), um zu überprüfen, was während eines Builds passiert - so können Sie sehen, ob %temp% verwendet wird (denken Sie daran, dass Antwortdateien wahrscheinlich mit FILE_ATTRIBUTE_TEMPORARY erstellt werden, was Schreibvorgänge auf der Festplatte nach Möglichkeit verhindern sollte). Ich habe meine %TEMP% auf eine RAM-Disk auslagern, was im Allgemeinen zu geringfügigen Geschwindigkeitssteigerungen führt.

Besorgen Sie sich eine RAM-Disk, die das automatische Laden/Speichern von Disk-Images unterstützt, damit Sie dafür keine Boot-Skripte verwenden müssen. Sequentielles Lesen/Schreiben eines einzelnen Disk-Images ist schneller als das Synchronisieren vieler kleiner Dateien.

Legen Sie Ihre häufig verwendeten/großen Header-Dateien auf der RAM-Disk ab, und überschreiben Sie die Standardpfade des Compilers, um die Kopien auf dem RAM-Laufwerk zu verwenden. Es wird wahrscheinlich nicht zu que Allerdings ist die Verbesserung nach den ersten Builds nicht sehr groß, da das Betriebssystem die Standard-Header zwischenspeichert.

Bewahren Sie Ihre Quelldateien auf Ihrer Festplatte auf und synchronisieren Sie sie mit der RAM-Disk. nicht umgekehrt . Überprüfen Sie MirrorFolder für die Echtzeitsynchronisierung zwischen Ordnern - dies wird über einen Filtertreiber erreicht, so dass nur das Notwendige synchronisiert wird (und nur Änderungen vorgenommen werden - ein 4 KB großer Schreibvorgang in eine 2 GB große Datei führt nur zu einem 4 KB großen Schreibvorgang im Zielordner). Finden Sie heraus, wie Sie Ihre IDE vom RAM-Laufwerk bauen, obwohl sich die Quelldateien auf der Festplatte befinden... und bedenken Sie, dass Sie einen groß RAM-Laufwerk für große Projekte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X