我一直在我相对较快的 Windows 机器上使用Cygwin运行drush脚本(用于Drupal),但我仍然需要等待大约一分钟才能执行任何 drush 命令(特别是drush cache clear才能执行)。
我很确定这与 Cygwin 的速度有关,因为我的开发人员(他们正在运行 Linux)可以在大约 5 秒内运行这些脚本。
有没有办法让 Cygwin 每个终端使用更多的内存和/或 CPU?
您遇到的问题不是 Cygwin 中的任意限制,您可以通过更改设置来消除这些限制。这是 Cygwin 必须工作以获取在其下构建的 POSIX 语义程序的固有方面。
POSIXfork()
系统调用在 Windows 上没有本机等效项,因此 Cygwin 被迫以非常低效的方式模拟它。每次执行外部进程时, Shell 脚本都会调用fork()
一次,这种情况经常发生,因为相对于我们通常所说的编程语言而言,Shell 脚本语言是如此贫乏。外部程序是 shell 脚本完成任何重要任务的方式。
Cygwin 中还有其他效率低下的地方,但如果您对其进行分析,您可能会发现这是排名第一的速度。在大多数地方,使用它构建的程序和底层操作系统之间的 Cygwin 层非常薄。Cygwin 的开发人员在保持层尽可能薄的同时仍然提供正确的 POSIX 语义付出了很多努力。当前fork()
呼叫仿真中不常见的厚度是不可避免的,除非 Microsoftfork()
在其操作系统中添加本机类型工具。他们这样做的动机不是很好。
上面作为评论发布的解决方案还不错。
另一种可能性是浏览drush
脚本,看看是否有对外部程序的调用,您可以用 shell 内在函数或更有效的构造替换。我不希望这样做会大大提高速度,但是它具有很好的特性,您也可以在 Linux 方面加快速度。(fork()
在 Linux 上效率很高,但启动外部程序仍然是一个很大的速度打击,您可能不必像现在那样经常付费。)例如:
numlines=`grep somepattern $somefile | wc -l`
if [ $numlines -gt 0 ] ; then ...
会运行得更快:
if grep -q somepattern $somefile ; then ...
第一个版本可以说更清晰,但它至少需要三个外部程序调用,并且使用原始 shell,需要四个. (你看到所有这些了吗?)替换只需要一个外部程序调用。
还要看一下减缓 Cygwin 启动速度的因素:
bash_profile
,而不是bashrc
。您可以给 Cygwin 更高的优先级。
编写一个新的批处理文件,例如“cygstart.bat”,其内容如下:
start "Cygwin" /high C:\cygwin\Cygwin.bat
该/high
开关赋予 shell 更高的进程优先级。