我有一个 java 进程和一个 C++ 进程通过共享内存段相互通信(使用 jni 进行 java 端通信)。如果在 java 中有 1 个线程,在 C++ 中有 1 个线程,则代码运行速度不错,但是一旦我在进程中使用多个线程,性能就会下降很多(几乎是 100 倍)。
在此之后,我在代码中调整了一些东西(我在我的 core2duo 系统上运行)并发现当我将 java 进程映射到一个内核上时说 core0 和 core1 上的 cpp 进程(使用 sched_affinity())性能恢复回来。
为什么会这样?我认为问题可能是共享内存段上的缓存争用,但是,这个核心映射提高了性能。此外,仅当使用多个线程时才会观察到该行为。如果在两个进程中都使用单个线程,则速度是正常的。