Во-первых, я удивлен тем, что ваша операция Dequeue на ArrayQueue настолько дорогая. Вы перемещаете все содержимое очереди в каждой очереди? Существует гораздо лучший подход - поискать «круговую очередь» онлайн.
Теперь перейдем к измерениям. Сложная сложность рассказывает только часть истории. Когда вы начнете измерять время работы, вы увидите множество сложных эффектов, таких как:
кэши
Похоже, ваш тест помещает кучу элементов в очередь, а затем удаляет их из очереди. Если вся очередь помещается в кэш L1 вашего процессора, все операции с памятью будут быстрыми.
Если размер очереди превышает кэш L1, данные должны будут пролиться в кэш L2, что может привести к замедлению в 2-3 раза. Если размер очереди превышает кэш L2, данные должны будут попасть в основную память, и вы получите еще одно значительное снижение производительности - скажем, в 5 раз.
Сборка мусора
Из названий ваших типов я бы предположил, что вы используете язык со сборкой мусора, такой как Java или C #. Если это так, то это означает, что ваша программа может сделать паузу в любое время (не совсем «в любое время», но сейчас это не важно) и потратить некоторое время на очистку памяти.
Другие эффекты
Я бы предположил, что два упомянутых выше эффекта - это те, с которыми вы, скорее всего, столкнетесь в сценарии, подобном вашему, но в компиляторе, виртуальной машине, есть множество других сложных вариантов поведения. , ОС и оборудование, затрудняющее интерпретацию измерений производительности.
Это может быть отличным опытом обучения - а также увлекательным - попытаться выяснить, почему именно ваши показатели производительности вышли определенным образом, но, безусловно, не тривиальны.