我有一个库来支持 Linux 和 Windows 上的 Java 中的线程亲和性。https://github.com/peter-lawrey/Java-Thread-Affinity
如果您隔离 CPU,您可以确保您分配的 CPU 不会用于其他任何事情(除了不可屏蔽的中断)这在 Linux AFAIK 中效果最好。
如果您使用非阻塞 NIO 的忙等待而不是阻塞 IO,您可以获得更低的延迟结果。后者在负载下工作得最好,在较低的负载下,延迟会增加。
您可能会发现这个库很有趣https://github.com/peter-lawrey/Java-Chronicle它允许您每秒保存数百万条消息,可选地保存到第二个进程。
顺便说一句:线程优先级只是一个提示,操作系统可以自由地忽略它(并且经常这样做)
一个比较暖代码和冷代码的简单示例。它所做的只是重复复制一个数组并对其计时。一旦代码和数据升温,您就不会期望它会变慢,但即使在一台相当安静的机器上,它所需要的只是 10 毫秒的延迟,以显着减慢复制所需的时间。
public static void main(String... args) throws InterruptedException {
int[] from = new int[60000], to = new int[60000];
for (int i = 0; i < 10; i++)
copy(from, to); // warm up
for (int i = 0; i < 10; i++) {
long start = System.nanoTime();
copy(from, to);
long time = System.nanoTime() - start;
System.out.printf("Warm copy %,d us%n", time / 1000);
}
for (int i = 0; i < 10; i++) {
Thread.sleep(10);
long start = System.nanoTime();
copy(from, to);
long time = System.nanoTime() - start;
System.out.printf("Cold copy %,d us%n", time / 1000);
}
}
private static void copy(int[] a, int[] b) {
for (int i = 0, len = a.length; i < len; i++)
b[i] = a[i];
}
印刷
Warm copy 20 us
Warm copy 20 us
Warm copy 19 us
Warm copy 23 us
Warm copy 20 us
Warm copy 20 us
Cold copy 100 us
Cold copy 80 us
Cold copy 89 us
Cold copy 92 us
Cold copy 80 us
Cold copy 112 us