0

我一直在对 Chronicle 队列进行一些性能测试,但我没有得到 Chronicle 声称的微秒延迟。我有一个作家和读者设置。写入器将当前时间写入队列,读取器从队列中读取并获取当前时间并进行差异获取延迟。我对一百万条消息执行此操作,然后取平均值。

我的作家的代码:

public class Client {
    public static void main(String[] args) {
    String path = "/dev/shm/queue";
    SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary(path).build();
    ExcerptAppender appender = queue.acquireAppender();
    Scanner read = new Scanner(System.in);
    for (int i = 0;i<1;i++){

        for (int j=0;j<1000000;j++) {
            long time = System.nanoTime();
            appender.writeText(Long.toString(time));
        }
    }
    appender.writeText("end");
    }
}

我的读者

public class Server {
    public static void main(String[] args) {
    String path = "/dev/shm/queue";
    SingleChronicleQueue queue = SingleChronicleQueueBuilder.binary(path).build();
    ExcerptTailer tailer = queue.createTailer();

    DescriptiveStatistics results = new DescriptiveStatistics();
    while (true) {
        String text = tailer.readText();
        if (text == null) {
            Jvm.pause(10);
        } else if (text.equals("end")) {
            System.out.println("Results: " + results.getMean() / 1000);
            break;
        }
        else {
            long cur = System.nanoTime();
            long recv = Long.parseLong(text);
            long diff = cur - recv;
            results.addValue(diff);
        }
    }
    }
}

我得到了几十甚至几百毫秒的延迟。有什么可以帮助我的吗?我认为我做的事情显然是错误的。

4

1 回答 1

1

延迟很可能是真实的。如果你写得尽可能快,那么作者可能会领先于读者,运行测试的时间越长,延迟就会越长。大多数消息传递系统都有流控制,这会减慢生产者的速度,但这种效果会使测试看起来更好。顺便说一句,尽管这不会导致如此大的延迟,但您并没有预热代码。

我建议你试试

  • 向编写器添加一个繁忙的循环,以将其限制为每微秒一条消息。即说每秒一百万。
  • 读者忙等待还是使用Thread.yield()。我建议使用我们的 Pauser.balanced()
  • 尝试忽略前 20k 甚至 100k 的结果,在热身后查看并运行测试约 10 秒或更长时间。
  • 尽量不产生任何垃圾。您可以将 long 附加到已清除/回收的 StringBuilder 或 Bytes 作为文本或将其写入二进制。
于 2017-05-15T06:28:33.220 回答