在另一个线程上有效执行的工作的最小大小?

时间:2010-10-13 17:03:53

标签: java multithreading performance low-latency

我有一个接收UDP消息的低延迟系统。根据消息,系统通过发送0到5条消息进行响应。确定每个可能的响应需要50 us(微秒),因此如果我们必须发送5个响应,则需要250 us。

我正在考虑拆分系统,以便每个可能的响应都由不同的线程计算,但我很好奇为了使这个更好的最小“工作时间”。虽然我知道我需要对此进行基准测试以确定,但我对在单独的线程中应该完成的最小工作量的意见感兴趣。

如果我有5个线程在等待一个信号来做50美元的工作,并且他们没有太大的争议,那么在所有5个完成之前的总时间是否大于或小于250 us?

3 个答案:

答案 0 :(得分:1)

50us是计算限制的,还是IO绑定的?如果是计算限制的,您是否有多个可用于并行运行的内核?

抱歉 - 很多问题,但您的特定环境会影响到答案。您需要分析并确定在您的特定方案中有什么不同(可能运行具有不同大小Threadpools的测试?)。

不要忘记(也)线程默认为其堆栈占用大量内存(默认为512k,IIRC),这也可能影响性能(通过分页请求等)。

答案 1 :(得分:1)

如果线程已在核心上运行,则将数据从一个线程传递到另一个线程非常快。 (而不是睡眠/等待/让步)如果您的线程必须唤醒它可能需要15 us,但任务也将花费更长时间,因为缓存可能有大量未命中。这意味着任务可能需要2-3倍的时间。

答案 2 :(得分:0)

如果你有更多的内核而不是线程,并且如果线程是真正独立的,那么如果多线程方法花费少于250 us我就不会感到惊讶。是否这样做将取决于创建和销毁线程的开销。但是,你的情况似乎很理想。