我一直在跑drush脚本(用于 Drupal )与 Cygwin在我相对较快的 Windows 机器上,但我仍然需要等待 大约一分钟 才能执行任何 drush 命令(特别是 drush cache clear 才能执行)。
我很确定这与 Cygwin 的速度有关,因为我的开发人员(运行 Linux)可以在大约 5 秒内运行这些脚本。
有没有办法让 Cygwin 在每个终端使用更多内存和/或 CPU?
最佳答案
您遇到的问题不是 Cygwin 中的一些任意限制,您可以通过更改设置来消除这些限制。这是 Cygwin 必须努力获得在其下构建的 POSIX 语义程序所期望的方式的一个固有方面。
POSIX fork()
系统调用在 Windows 上没有本地等效项,因此 Cygwin 被迫在 a very inefficient way 中模拟它.每次执行外部进程时,Shell 脚本都会调用 fork()
,这种情况经常发生,因为 Shell 脚本语言相对于我们通常所说的编程语言来说非常贫乏。外部程序是 shell 脚本完成任何重要任务的方式。
Cygwin 中还有其他低效之处,但如果您对其进行概要分析,您可能会发现这是影响速度的第一大障碍。在大多数地方,使用它构建的程序与底层操作系统之间的 Cygwin 层非常薄。 Cygwin 的开发人员煞费苦心地保持该层尽可能薄,同时仍提供正确的 POSIX 语义。 fork()
调用仿真中当前不常见的厚度是不可避免的,除非 Microsoft 在其操作系统中添加 native fork()
类型的工具。他们这样做的动机不是很好。
上面作为评论发布的解决方案还不错。
另一种可能性是检查 drush
脚本,看看是否有对外部程序的调用,您可以用 shell 内在函数或更高效的构造替换。我不希望这样做会带来巨大的速度提升,但它具有一个很好的特性,即您也可以在 Linux 端加快速度。 (fork()
在 Linux 上是高效的,但启动外部程序仍然是一个很大的速度问题,您可能不必像现在那样经常付费。)例如:
numlines=`grep somepattern $somefile | wc -l`
if [ $numlines -gt 0 ] ; then ...
运行速度会更快:
if grep -q somepattern $somefile ; then ...
第一个版本可以说更清晰,但它至少需要三个外部程序调用,并且使用原始 shell,四个。 (你看到所有这些了吗?)替换只需要一个外部程序调用。
关于bash - 如何加速Cygwin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2512892/