java – ThreadLocalRandom与共享静态随机实例性能比较测试
在我们针对一项任务的项目中,我们使用静态随机实例进行随机数生成目标.
Java 7发布后,出现了新的ThreadLocalRandom类用于生成随机数.
来自规格:
并且:
所以我做了一个小测试: public class ThreadLocalRandomTest { private static final int THREAD_COUNT = 100; private static final int GENERATED_NUMBER_COUNT = 1000; private static final int INT_RIGHT_BORDER = 5000; private static final int EXPERIMENTS_COUNT = 5000; public static void main(String[] args) throws InterruptedException { System.out.println("Number of threads: " + THREAD_COUNT); System.out.println("Length of generated numbers chain for each thread: " + GENERATED_NUMBER_COUNT); System.out.println("Right border integer: " + INT_RIGHT_BORDER); System.out.println("Count of experiments: " + EXPERIMENTS_COUNT); int repeats = 0; int workingTime = 0; long startTime = 0; long endTime = 0; for (int i = 0; i < EXPERIMENTS_COUNT; i++) { startTime = System.currentTimeMillis(); repeats += calculateRepeatsForSharedRandom(); endTime = System.currentTimeMillis(); workingTime += endTime - startTime; } System.out.println("Average repeats for shared Random instance: " + repeats / EXPERIMENTS_COUNT + ". Average working time: " + workingTime / EXPERIMENTS_COUNT + " ms."); repeats = 0; workingTime = 0; for (int i = 0; i < EXPERIMENTS_COUNT; i++) { startTime = System.currentTimeMillis(); repeats += calculateRepeatsForTheadLocalRandom(); endTime = System.currentTimeMillis(); workingTime += endTime - startTime; } System.out.println("Average repeats for ThreadLocalRandom: " + repeats / EXPERIMENTS_COUNT + ". Average working time: " + workingTime / EXPERIMENTS_COUNT + " ms."); } private static int calculateRepeatsForSharedRandom() throws InterruptedException { final Random rand = new Random(); final Map<Integer,Integer> counts = new HashMap<>(); for (int i = 0; i < THREAD_COUNT; i++) { Thread thread = new Thread() { @Override public void run() { for (int j = 0; j < GENERATED_NUMBER_COUNT; j++) { int random = rand.nextInt(INT_RIGHT_BORDER); if (!counts.containsKey(random)) { counts.put(random,0); } counts.put(random,counts.get(random) + 1); } } }; thread.start(); thread.join(); } int repeats = 0; for (Integer value : counts.values()) { if (value > 1) { repeats += value; } } return repeats; } private static int calculateRepeatsForTheadLocalRandom() throws InterruptedException { final Map<Integer,Integer> counts = new HashMap<>(); for (int i = 0; i < THREAD_COUNT; i++) { Thread thread = new Thread() { @Override public void run() { for (int j = 0; j < GENERATED_NUMBER_COUNT; j++) { int random = ThreadLocalRandom.current().nextInt(INT_RIGHT_BORDER); if (!counts.containsKey(random)) { counts.put(random,counts.get(random) + 1); } } }; thread.start(); thread.join(); } int repeats = 0; for (Integer value : counts.values()) { if (value > 1) { repeats += value; } } return repeats; } } 我还添加了非共享随机测试,得到了下一个结果: Number of threads: 100 Length of generated numbers chain for each thread: 100 Right border integer: 5000 Count of experiments: 10000 Average repeats for non-shared Random instance: 8646. Average working time: 13 ms. Average repeats for shared Random instance: 8646. Average working time: 13 ms. Average repeats for ThreadLocalRandom: 8646. Average working time: 13 ms. 至于我,这有点奇怪,我预计至少在使用ThreadLocalRandom与共享的Random实例相比时速度会提高,但看起来没什么区别. 有人可以解释为什么它的工作方式,也许我不明白的东西.提前致谢. 解决方法
你没有并行运行任何东西,因为你正在等待每个线程在启动后立即完成.你需要在循环之外的一个等待循环来启动线程:
List<Thread> threads = new ArrayList<Thread>(); for (int i = 0; i < THREAD_COUNT; i++) { Thread thread = new Thread() { @Override public void run() { for (int j = 0; j < GENERATED_NUMBER_COUNT; j++) { int random = rand.nextInt(INT_RIGHT_BORDER); if (!counts.containsKey(random)) { counts.put(random,0); } counts.put(random,counts.get(random) + 1); } } }; threads.add(thread); thread.start(); } for (Thread thread: threads) { thread.join(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |