Значение не берется из словаря в JMH, когда поток равен 2? - PullRequest
0 голосов
/ 20 мая 2018

Для класса JMH номер резьбы ограничен 1 через @ Threads (1) .

Однако, когда я получаю количество потоков, используя Thread.activeCount () , это показывает, что существует 2 потока.

Упрощенная версия кода приведена ниже:

@Fork(1)
@Warmup(iterations = 10)
@Measurement(iterations = 10)
@BenchmarkMode(Mode.AverageTime) 
@OutputTimeUnit(TimeUnit.MICROSECONDS) 
@Threads(1)

public class MyBenchmark {

    @State(Scope.Benchmark)
    public static class BState {

        @Setup(Level.Trial) 
        public void initTrial() {

        }

        @TearDown(Level.Trial)
        public void tearDownTrial(){

        }
    }

    @Benchmark
    public List<Integer> get(BState state) {

        System.out.println("Thread number: " + Thread.activeCount());
        ...
        List<byte[]> l = new ArrayList<byte[]>(state.dict.get(k));
        ...
    }
}

На самом деле значение пытается получить из словаря , используя его ключ.Однако, когда существует 2 потока, ключ не может получить из словаря, и здесь список l становится [] .

Почему ключ не берется?Из-за этого количество нитей ограничено 1.

1 Ответ

0 голосов
/ 21 мая 2018

Thread.activeCount() отвечает за количество потоков в системе, а не обязательно за количество потоков тестов.Использование этого для разделения работы между потоками тестов опасно из-за этого фундаментального разъединения.ThreadParams может помочь получить индексы потоков тестов, если это необходимо, см. соответствующий пример .

Если вы хотите получить более убедительный ответ, вам нужно предоставить MCVE, который четко выделит вашу проблему.

...