2010-03-25 17 views
19

Ich habe drush Skripte läuft (für drupal) mit cygwin auf meinem relativ schnell Windows-Rechner, aber ich habe noch etwa eine Minute für jeden drush Befehl warten (speziell drush Cache klar auszuführen).Wie beschleunigt man Cygwin?

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

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

+6

-Stick ein ubuntu CD in? :) – Rimian

+2

Diese Frage setzt voraus, dass die Leistung von Windows Drush Linux Drush entspricht und Speicher oder CPU begrenzt ist. Das ist keine Selbstverständlichkeit: Es könnte einfach langsamer sein. Geben Sie – msw

+3

Virtualisierung einen Versuch ... mit Hardware-Unterstützung kann es wirklich erstaunlich sein –

Antwort

25

Das Problem, auf das Sie stoßen, ist nicht irgendein willkürliches Limit in Cygwin, das Sie mit einer Einstellungsänderung verschwinden lassen können. Es ist ein inhärenter Aspekt der Art und Weise, wie Cygwin arbeiten muss, um die POSIX-Semantik-Programme, die unter ihm erstellt werden, zu erwarten.

Der Systemaufruf POSIX fork() hat unter Windows keine systemeigene Entsprechung, daher muss Cygwin es in a very inefficient way emulieren. Shell-Skripte verursachen jedes Mal, wenn sie einen externen Prozess ausführen, einen Aufruf an fork(), was ziemlich oft vor sich geht, da die Shell-Script-Sprachen relativ zu dem, was wir normalerweise eine Programmiersprache nennen, so verarmt sind. Externe Programme sind, wie Shell-Skripte etwas Konsequentes tun.

Es gibt noch andere Ineffizienzen in Cygwin, obwohl, wenn Sie es profilierten, würden Sie wahrscheinlich finden, dass das die Nummer eins Geschwindigkeitshit ist. An den meisten Stellen ist die Cygwin-Ebene zwischen einem Programm, das mit ihr erstellt wurde, und dem zugrunde liegenden Betriebssystem ziemlich dünn. Die Entwickler von Cygwin geben sich große Mühe, die Schicht so dünn wie möglich zu halten und dennoch die korrekte POSIX-Semantik zu liefern. Die aktuelle ungewöhnliche Dicke in der fork() Call-Emulation ist unvermeidlich kurz von Microsoft Hinzufügen einer systemeigenen fork() Anlage zu ihrem Betriebssystem. Ihre Anreize, das zu tun, sind nicht sehr gut.

Die oben genannten Kommentare sind nicht schlecht.

Eine andere Möglichkeit ist durch das drush Skript zu gehen und sehen, ob es Gespräche auf externe Programme, die Sie mit Shell-Spezifika oder effizientere Konstrukte ersetzen können. Ich würde nicht eine enorme Geschwindigkeitsverbesserung damit erwarten, aber es hat die nette Eigenschaft, dass Sie die Dinge auch auf der Linux-Seite beschleunigen werden. (fork() ist effizient auf Linux, aber externe Programme zu starten ist immer noch eine große Geschwindigkeit getroffen, dass Sie vielleicht nicht so oft zu zahlen haben, wie Sie derzeit tun.) 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, aber es erfordert mindestens drei externe Programmaufrufe, und mit primitiven Shells, vier. (Sehen Sie alle?) Die Ersetzung erfordert nur einen externen Programmaufruf.

6

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

eine neue Batch-Datei, für exampe "cygstart.bat" mit folgendem Inhalt schreiben:

# cygstart.bat

start "Cygwin"/hohe C: \ cygwin \ Cygwin.

bat

der „/ high“ - Schalter verleiht der Hülle eine höhere Prozesspriorität.

9

Schauen Sie auch auf Dinge, die Cygwin Startup verlangsamen:

  • Trim Sie Ihre PATH von Windows (auf die nackten Knochen wie% SystemRoot% \ system32;% SystemRoot%)
  • Dinge entfernen Sie dies nicht tun müssen von bashrc und bash_profile
  • verschieben Dinge, die Sie nur in Ihrem Terminal-Fenster von bashrc benötigen
  • Eine überraschend große Zeit saugen in cygwin ist bash Abschluss bash_profile. Wenn Sie es verwenden (und Sie sollten es, weil es großartig ist), nur Quellvervollständigung für die Befehle, die Sie benötigen (und nicht alle von ihnen, die die Standardeinstellung waren). Und wie oben erwähnt, beziehen Sie sie von bash_profile nicht bashrc.
+3

Das "PATH" kann einen großen Unterschied ausmachen. :) – Rufflewind