关于优化windows版本emacs的进展(2024-6-16更新,绕过了子进程/套接字数量限制)

代码贡献应该发至 [email protected],谢谢

2 个赞

轻量用了几天,没发现 too may open files了,感觉win版本的反应速度也还行,除了被git速度影响的magit……

找了一下,应该是这个 bug#71628: sys_select and waitpid optimize in windows emacs (gnu.org)

目前似乎还没有合并…

有人跟我联系了几次,提交了一些信息,后续我也不知道还要怎么弄 :rofl:

等 FSF 签完了应该就能合了 :innocent:

1 个赞

不会是纸质的吧? :thinking:

1 个赞

电子的就行,只是 FSF 文员效率不高,如果一周以后没有回复发邮件催一下并 cc 给 Eli

1 个赞

它会发个 PDF 给你, 然后你去把它打印下来, 在上面签署你的名字, 然后把扫描件发回去就好了

2 个赞

恭喜啊,要成了 :+1: 这是自己模拟的多线程绕开限制?

1 个赞

不是,就动了个 #define 定义的常量,再手动对调用厡来 API 的地方做了个调度

2 个赞

额,就是另外模拟的api呀,只改宏定义没用 Comparing master...new_sys_select_for_win · heheda123123/emacs · GitHub

1 个赞

是的,可以看我发的对比链接

1 个赞

应该就是 Windows 官方文档里的推荐用法吧,说不上摸拟

To wait on more than MAXIMUM_WAIT_OBJECTS handles, use one of the following methods:

  • Create a thread to wait on MAXIMUM_WAIT_OBJECTS handles, then wait on that thread plus the other handles. Use this technique to break the handles into groups of MAXIMUM_WAIT_OBJECTS.
2 个赞

看了下文档,似乎 Win32 的线程池也可以用,不用它是因为 Emacs 之前的代码改起来比较麻烦吗。

1 主要原因是上面oldfans提到的,改的代码需要能支持9x :rofl:
2 另外我自己改了一版用线程池的,没啥提升,因为比如启动100个子进程(包括套接字等),会增加一百多个线程,这里面只有几个线程是用于这里监控事件的,而其中有100个线程是直接跟子进程相关的,每启动一个子进程就会多一个线程,这个要动就要大改代码

3 个赞

还有后续吗,合并到emasc了没

没后续,感兴趣的直接拿我的代码去合吧,流程太麻烦了 :rofl:

subprocess.patch

改了一下,现在用了个非常“青春版”的线程池,去掉了所有的 malloc。

线程只会在需要的时候被创建,而且创建后不会销毁,而是在需要的时候复用。

明天写个总结。

要在 Windows 上使用这个 patch 的话,下载 gist 压缩包或者直接文本复制保存之后(记得是 LF 换行),然后 git apply 或者 Magit 打上再编译就行了。

(defun create-ping-process (index)
  "Create a ping process for a given INDEX."
  (let ((process-name (format "ping-process-%d" index))
        (buffer-name (format "*ping-output-%d*" index))
        (host "127.0.0.1"))
    (start-process process-name
                   buffer-name
                   "ping" host)))

(defun create-multiple-ping-processes (count)
  "Create COUNT ping processes."
  (dotimes (i count)
    (create-ping-process i)))

(create-multiple-ping-processes 200)

只能创建 1021 而不是 1024 个子进程和改之前只能创建 29 个而不是 32 个一样。

(考虑到 select 最多支持 1024 ,我这里也就限制到 1024 了)

3 个赞

对magit有提升吗

对性能没有任何提升,只是为了让 Emacs 能够开更多子进程(缓解下子进程数量限制焦虑而已)

如果同一时间启动大量子进程(比如一两百个,但是我想象不到一个编辑器什么时候会用到这么多),你的鼠标基本上动不了了。真要“高并发”还得用点现代的东西。

等会测下现在 Emacs 当服务器能接受多少个连接去,不过也许这个和“子进程”数量没有太大关系

具体讨论见: Re: Increase FD_SETSIZE in w32.h to allow more than 32 (actually 29) sub