Мне необходимо в бенчмарке выполнять некоторые операции в другом потоке, для того что бы их не создавать каждый раз, я хочу иметь трэд пул и в нем выполнять эти операции.
Достаточно ли быстрый джавовый ExecutorService или стоит написать свой ?
Судя по тому что происходит внутри кода ThreadPoolExecutor, вам он не подходит. Потому что внутри него создается поток для новой задачи, этого можно избежать, создав такой поток с помощью пустой задачи заранее, но все же много логики остается. Думаю что-то своё, что будет в цикле ожидать появления чего либо в AtomicReference или ConcurrentQueue будет быстрее.
Это с одной стороны. С другой стороны, не забывайте, что в любом случае есть такая штука как операционная система и время на переключения контекста при смене потока. Вам все равно не получится избежать некоторых задержек. (если вы когда нибудь писали тесты скажем на си, то там всегда результаты отличались на 10-20, порой даже на 100мс - вот вам и система)
То есть у вас уже есть ограничения на длительность теста, чтобы можно было как-то свести работу системы до "в пределе погрешности".
В третьих Java машина. Она постоянно оптимизирует код, ориентироваться на цифры полученые просто самописными тестами с System.currentTimeMillis очень сложно. Это уже тема отдельного вопроса, есть определенные бенчмарки, есть списки правил, что-то конкретное подсказать сложно, не было у меня необходимости еще получать точные цифры.
В четвертых, это что такой за бенчмарк с отдельными потоками? Конечно может быть у вас там "всё схвачено" и вы понимаете что делаете, но звучито это странно. По крайней мере в совокупности с заморочками насчет скорости тред пула.
В общем как вывод - тред пул далеко не самая большая проблема что у вас возникает. Используйте обычный ThreadPoolExecutor, если вдруг вам покажется, что он на что-то там влияет, ну напишите свою реализацию. Это по факту дело 10 минут.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей