19

我一直在我相对较快的 Windows 机器上使用Cygwin运行drush脚本(用于Drupal),但我仍然需要等待大约一分钟才能执行任何 drush 命令(特别是drush cache clear才能执行)。

我很确定这与 Cygwin 的速度有关,因为我的开发人员(他们正在运行 Linux)可以在大约 5 秒内运行这些脚本。

有没有办法让 Cygwin 每个终端使用更多的内存和/或 CPU?

4

3 回答 3

32

您遇到的问题不是 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,需要四个. (你看到所有这些了吗?)替换只需要一个外部程序调用。

于 2010-03-25T22:05:49.923 回答
11

还要看一下减缓 Cygwin 启动速度的因素:

  • 修剪你的 Windows PATH(到 %SystemRoot%\system32;%SystemRoot% 之类的基本内容)
  • 从 bashrc 和 bash_profile 中删除不需要的东西
  • 将您只需要在终端窗口中的东西从 bashrc 移动到 bash_profile
  • Cygwin 中一个令人惊讶的大问题是 Bash 完成。如果你正在使用它(你应该使用它,因为它很棒),只需要你需要的命令的源代码完成(而不是所有这些曾经是默认的)。并且,如上所述,它们来自bash_profile,而不是bashrc
于 2012-04-21T20:26:22.770 回答
6

您可以给 Cygwin 更高的优先级。

编写一个新的批处理文件,例如“cygstart.bat”,其内容如下:

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

/high开关赋予 shell 更高的进程优先级。

于 2011-01-24T16:31:06.873 回答