1

我有一个使用工作队列和线程的端口扫描应用程序。

它使用简单的 TCP 连接并花费大量时间等待数据包返回(最多半秒)。因此线程不需要完全执行(即前半部分发送一个数据包,上下文切换,做一些事情,回到有网络数据等待它的线程)。

我怀疑我可以通过修改默认值 100 来提高性能sys.setcheckinterval(在切换到另一个线程之前最多可以执行 100 个字节码)。

但是在不知道线程或函数中实际执行了多少字节码的情况下,我盲目地猜测值,测试和依赖测试显示出可测量的差异(这很困难,因为正在执行的代码量很少;一个简单的socket 连接,因此网络抖动可能会影响任何测量,而不是更改 sys.setcheckinterval)。

因此,我想找出某些代码执行中有多少字节码(即一个函数或线程执行的总数),以便我可以更明智地猜测将 sys.setcheckinterval 设置为什么。

4

3 回答 3

3

对于更高级别(方法,类)的明智,dis 模块应该有所帮助。

但如果需要更细的粒度,追踪将是不可避免的。跟踪确实逐行运行,但这里解释的是在字节码级别深入研究的一个很好的技巧。向 Ned Batchelder 致敬。

于 2008-11-17T05:50:00.567 回答
2

对如此复杂的系统进行推理很少会产生正确的答案。测量结果,并使用运行最快的设置。如果如您所说,测试无法测量 setcheckinterval 的各种设置的差异,那为什么还要更改它呢?只有可测量的差异才是有趣的。如果您的测试运行时间太短而无法提供有意义的数据,那么请延长运行时间,直到它提供。

于 2008-11-18T03:05:53.283 回答
1

“我怀疑我可以通过修改 sys.setcheckinterval 来提高性能”

这很少奏效。正确的行为不能依赖于时间——你无法控制时间。操作系统、硬件、Python 的补丁级别或月相的细微变化将改变您的应用程序的行为方式。

选择模块是用来等待 I/O 的。您的应用程序可以构造为一个主循环,为其他线程执行选择和排队工作。其他线程正在等待其处理请求队列中的条目。

于 2008-11-17T12:37:11.073 回答