我对低延迟代码感兴趣,这就是我尝试配置线程关联的原因。特别是,它应该有助于避免上下文切换。
我已经使用https://github.com/OpenHFT/Java-Thread-Affinity配置了线程关联。我运行非常简单的测试代码,它只是循环检查时间条件。
long now = start;
while (true)
{
if (now < start + TimeUtils.NANOS_IN_SECOND * delay)
{
now = TimeUtils.now();
}
else
{
// Will be printed after 30 sec
if (TimeUtils.now() > start + TimeUtils.NANOS_IN_SECOND * (delay + 30))
{
final long finalNow = now;
System.out.println("Time is over at " +
TimeUtils.toInstant(finalNow) + " now: " +
TimeUtils.toInstant(TimeUtils.now()));
System.exit(0);
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在指定的延迟执行后转到“else”并且大约在同一时间我看到上下文切换。这是预期的行为吗?造成这种情况的具体原因是什么?在这种情况下如何避免上下文切换?
测试详情
我从这个 repo 构建 shadowJar:https : //github.com/stepan2271/thread-affinity-example。然后我使用以下命令运行它(可以在这里玩数字,当延迟 > 60 时它对测试没有显着影响):
taskset …Run Code Online (Sandbox Code Playgroud)