将局部变量转换为对象属性的性能提升

Performance gain in turning local variables into object attributes

提问人:Lucas Steffen 提问时间:12/28/2016 最后编辑:jaco0646Lucas Steffen 更新时间:12/28/2016 访问量:36

问:

我有 N 个线程查询一个网络服务并生成一个文件,然后等待 30 秒,然后重新做一遍。

我还有另外 N 个线程打开并读取这些文件,插入数据库,删除文件,等待 100 毫秒,然后重新执行。

在所有这些对象中,有很多方法有很多局部变量:整数、字符串、数组和其他特定于框架的对象。

最近,我们正在增加读取这些文件的线程数,因为 Web 服务返回的数据要多得多。

通过将所有局部变量转换为对象属性(实例变量),可以获得什么收益? 我认为它不会有那么多实例化,因为这将在对象本身实例化时完成一次。

我正在使用 Delphi,但我相信它可以回答任何编程语言或框架。

多线程 性能 与语言无关

评论

0赞 Cody Gray - on strike 12/28/2016
这很可能取决于语言/框架。“对象属性”到底是什么?
1赞 jaco0646 12/28/2016
@CodyGray,我猜是实例变量
0赞 jaco0646 12/28/2016
性能提升必须等于实例化变量的成本乘以冗余实例化的数量。对于整数和字符串,实例化成本可以忽略不计。对于数组和特定于框架的对象,成本取决于它们的大小。
0赞 Cody Gray - on strike 12/28/2016
实例变量怎么可能比局部变量便宜?如果它们是实例变量,则必须实现某种类型的并发保护(即锁定)。局部变量不需要它,因为根据定义,它们不会在多个线程之间共享。使用局部变量,可以简单地在堆栈上分配空间。这是一两个机器指令。没有比这更快的了。
0赞 Lucas Steffen 12/29/2016
@CodyGray这些实例变量不会被共享,因此不需要并发保护。只有一两条指令!?必须找到另一种方法来优化这件事

答:

1赞 user7291698 12/28/2016 #1

我不认为如果将局部变量转换为对象属性,性能不会显著提高。但是,从一个线程生成文件,从另一个线程读取文件,然后删除文件,听起来像是真正的瓶颈。如果没有充分的理由将文件用作临时存储,请使用单个线程而不是两个线程来查询 Web 服务,然后将数据写入数据库。