Performance 如何每秒处理大规模数据库操作-线程?

Performance 如何每秒处理大规模数据库操作-线程?,performance,timer,Performance,Timer,我有一个非常棘手的问题: 我有大约20-50个对象,我必须(这是针对问题给出的,请不要花时间思考)每秒对其进行一次逻辑分析 逻辑本身需要大约200-600毫秒(90%为200ms,10%为600ms) 我试图找到任何解决办法,我可以使它变小,但没有。我必须从DB得到一个对象,我必须有很多if-else,我必须实现它。-即使我把它减少到50毫秒或更小,物体的可验证速率高达50秒也会用1秒的计时器打断我的脖子,因为50x50mx=2,5秒。因此,滴答声需要比滴答声频率更长的时间 所以,我唯一的想法是

我有一个非常棘手的问题:

我有大约20-50个对象,我必须(这是针对问题给出的,请不要花时间思考)每秒对其进行一次逻辑分析

逻辑本身需要大约200-600毫秒(90%为200ms,10%为600ms)

我试图找到任何解决办法,我可以使它变小,但没有。我必须从DB得到一个对象,我必须有很多if-else,我必须实现它。-即使我把它减少到50毫秒或更小,物体的可验证速率高达50秒也会用1秒的计时器打断我的脖子,因为50x50mx=2,5秒。因此,滴答声需要比滴答声频率更长的时间

所以,我唯一的想法是为每个对象打开一个自己的线程,并引导一个主线程进行处理。因此,主线程打开另一个线程。因此,只有这个开口必须花费1秒的时间。在使用它的逻辑之后,线程可以自杀,我们都很高兴,不是吗


通过给出最后的答案,我将解释我的问题:

我试图建立一个拍卖网站。因此,我有多达50个拍卖在同一时刻运行-没有什么特别的。所以我需要:每秒钟查看一下拍卖列表,看看时间是否是00:00:01,如果是,自动出价(这是用户可以创建的功能)


因此:在列表中获取50个对象,迭代,检查是否需要自动出价,然后执行。

对于50个对象和您平均给出的处理时间,您每秒处理12秒。假设您有4个内核,您可以通过线程将执行时间减少到4秒。每一秒。这意味着,随着时间的推移,你将从后面开始,并进一步落后


我知道你说过你想办法让它更有效率,但没办法,但我担心你不得不这么做。现在所说的问题在计算上是难以解决的。您要么必须在旋转窗口中处理对象(因此每个对象大约每4个周期被击中一次),要么需要加快处理速度。

对于50个对象和您平均给出的处理时间,您每秒要处理12秒。假设您有4个内核,您可以通过线程将执行时间减少到4秒。每一秒。这意味着,随着时间的推移,你将从后面开始,并进一步落后


我知道你说过你想办法让它更有效率,但没办法,但我担心你不得不这么做。现在所说的问题在计算上是难以解决的。您要么必须在旋转窗口中处理对象(因此每个对象大约每4个周期被击中一次),要么需要加快处理速度。

首先:配置文件,如果您还没有。找出代码的哪一部分需要花费时间,等等。我会关注那个数据库——数据库中对象的I/O需要多长时间?你能缓存那个I/O吗?(如果要操作相同的50个对象,请不要每秒加载一次。)


让我们谈谈你的线程想法:如果你想要多个线程,不要每秒创建和销毁它们。创建您的X线程,并让它们保持不变——创建和销毁它们将是昂贵的操作。您可能会发现,线程数越少,效果越好,例如每个核心1或2个线程,因为您可能可以减少执行上下文切换的时间。

第一:配置文件,如果您还没有。找出代码的哪一部分需要花费时间,等等。我会关注那个数据库——数据库中对象的I/O需要多长时间?你能缓存那个I/O吗?(如果要操作相同的50个对象,请不要每秒加载一次。)


让我们谈谈你的线程想法:如果你想要多个线程,不要每秒创建和销毁它们。创建您的X线程,并让它们保持不变——创建和销毁它们将是昂贵的操作。您可能会发现,线程越少越好,例如每个核心1或2个线程,因为您可能可以减少进行上下文切换的时间。

根据OP的要求,详细介绍Jonathan Leffler对该问题的评论:(此答案是wiki)

假设您正在拍卖这三件物品,在指定时间结束:

10 Apples      - ends at 1:05:00 PM
20 Blueberries - ends at 2:00:00 PM
15 Pears       - ends at 3:50:00 PM
如果当前时间为下午1:00:00,则睡眠4分58秒(因为最近的项目在5分钟后结束)。我们使用2秒钟的时间进行处理-根据需要调整阈值。一旦我们吃完苹果,我们就可以睡(下午2点-现在()-2秒),吃蓝莓


请注意,当我们在下午1:04:58醒来处理苹果拍卖时,我们不会碰蓝莓或梨子——我们知道它们在未来仍有出路,所以我们不在乎。

根据OP的要求,进一步阐述Jonathan Leffler对这个问题的评论:(这个答案是一个维基)

假设您正在拍卖这三件物品,在指定时间结束:

10 Apples      - ends at 1:05:00 PM
20 Blueberries - ends at 2:00:00 PM
15 Pears       - ends at 3:50:00 PM
如果当前时间为下午1:00:00,则睡眠4分58秒(因为最近的项目在5分钟后结束)。我们使用2秒钟的时间进行处理-根据需要调整阈值。一旦我们吃完苹果,我们就可以睡(下午2点-现在()-2秒),吃蓝莓


请注意,当我们在下午1:04:58醒来处理苹果拍卖时,我们不会碰蓝莓或梨子——我们知道它们在未来仍有出路,所以我们不在乎。

这是一个很好的观点——找出你没有利用的资源,以及你是否可以利用它们来帮助你的问题。如果你做不到,那么你基本上就不走运了。线程等不会神奇地解决任何问题。线程可能有助于提高多核或多处理器机器上的吞吐量,但如果是单核,那么实际上可能会使用更多线程来降低速度。这是一个很好的观点-找出哪些资源没有被利用,以及你是否能够利用这些资源