Frage

Ich bin gerannt drush Skripte (z Drupal) mit Cygwin auf meinem relativ schnellen Windows-Rechner, aber ich muss noch warten etwa eine Minute für jeden Drush-Befehl (insbesondere Drush-Cache leeren ausführen).

Ich bin mir ziemlich sicher, dass es etwas mit der Geschwindigkeit von Cygwin zu tun hat, da meine Entwicklerkollegen (die Linux verwenden) diese Skripte in etwa 5 Sekunden ausführen können.

Gibt es eine Möglichkeit, Cygwin dazu zu bringen, mehr Speicher und/oder CPU pro Terminal zu verbrauchen?

War es hilfreich?

Lösung

Das Problem, auf das Sie stoßen, ist nicht irgendein willkürliches Limit in Cygwin, das Sie durch eine Änderung der Einstellungen beseitigen können.Dies ist ein inhärenter Aspekt der Art und Weise, wie Cygwin arbeiten muss, um die darauf basierenden POSIX-Semantikprogramme wie erwartet zu erstellen.

Der POSIX fork() Der Systemaufruf hat unter Windows kein natives Äquivalent, daher ist Cygwin gezwungen, ihn zu emulieren ein sehr ineffizienter Weg.Shell-Skripte verursachen einen Aufruf von fork() jedes Mal, wenn sie einen externen Prozess ausführen, was ziemlich häufig vorkommt, da die Shell-Skriptsprachen im Vergleich zu dem, was wir normalerweise als Programmiersprache bezeichnen würden, so dürftig sind.Mit externen Programmen erledigen Shell-Skripte wichtige Aufgaben.

Es gibt noch andere Ineffizienzen in Cygwin. Wenn Sie sich jedoch ein Bild davon machen, werden Sie wahrscheinlich feststellen, dass dies der größte Geschwindigkeitseinbußen ist.An den meisten Orten ist die Cygwin-Schicht zwischen einem damit erstellten Programm und dem zugrunde liegenden Betriebssystem ziemlich dünn.Die Entwickler von Cygwin legen großen Wert darauf, die Schicht so dünn wie möglich zu halten und gleichzeitig die korrekte POSIX-Semantik bereitzustellen.Die derzeit ungewöhnliche Dicke in der fork() Eine Anrufemulation ist unvermeidbar, es sei denn, Microsoft fügt eine native hinzu fork() Geben Sie die Funktion für ihr Betriebssystem ein.Ihre Anreize dazu sind nicht sehr gut.

Die oben als Kommentare geposteten Lösungen sind nicht schlecht.

Eine andere Möglichkeit besteht darin, durchzugehen drush Skript und prüfen Sie, ob es Aufrufe externer Programme gibt, die Sie durch Shell-intrinsische oder effizientere Konstrukte ersetzen können.Ich erwarte dadurch keine enorme Geschwindigkeitsverbesserung, aber es hat die nette Eigenschaft, dass man die Dinge auch auf der Linux-Seite beschleunigt.(fork() ist unter Linux effizient, aber das Starten externer Programme stellt immer noch einen großen Geschwindigkeitseinbruch dar, für den Sie möglicherweise nicht so oft zahlen müssen wie derzeit.) Zum Beispiel:

numlines=`grep somepattern $somefile | wc -l`
if [ $numlines -gt 0 ] ; then ...

würde schneller laufen als:

if grep -q somepattern $somefile ; then ...

Die erste Version ist wohl klarer, erfordert aber mindestens drei externe Programmaufrufe und mit primitiven Shells, vier.(Sehen Sie alle?) Der Ersatz erfordert nur einen externen Programmaufruf.

Andere Tipps

Sehen Sie sich auch Dinge an, die das Cygwin -Startup verlangsamen:

  • Schneiden Sie Ihren Windows -Pfad ab (auf die nackten Knochen wie%systemroot% system32;%systemroot%)
  • Entfernen Sie Dinge, die Sie nicht von bashrc und bash_profile benötigen
  • Bewegen Sie Dinge, die Sie nur in Ihrem Terminalfenster benötigen, von bashrc auf bash_profile
  • Eine überraschend große Zeit, die in Cygwin saugt, ist die Fertigstellung. Wenn Sie es verwenden (und Sie sollten, weil es großartig ist), haben Sie nur die Fertigstellung der Befehle, die Sie benötigen (und nicht alle von ihnen, die früher die Standardeinstellung waren). Und, wie oben erwähnt, sie aus beziehen bash_profile, nicht bashrc.

Sie können Cygwin eine höhere Priorität geben.

Schreiben Sie eine neue Batch -Datei, z. B. "cygstart.bat" mit dem folgenden Inhalt:

start "Cygwin" /high C:\cygwin\Cygwin.bat

Das /high Switch gibt der Shell eine höhere Prozesspriorität.

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