单例模式使用 懒汉模式和饿汉模式以及使用enum方式的性能测试
2011-01-17 16:20
411 查看
本问分别使用懒汉、恶汉以及enum测试实现单例模式的不同实现,测试了他们的性能:
得出结论
(1)饿汉模式是懒汉模式的5倍左右,由于同步方法的业务方法逻辑简单,随着需要同步的业务方法复杂性变大,差距会逐渐变小。
(2)饿汉模式和enum实现的单例速度大致相等。
结果
得出结论
(1)饿汉模式是懒汉模式的5倍左右,由于同步方法的业务方法逻辑简单,随着需要同步的业务方法复杂性变大,差距会逐渐变小。
(2)饿汉模式和enum实现的单例速度大致相等。
public class SinglePerformanceTest { static public class CountInc { private volatile long count = 0; public void action() { count++; } } static public class LazySingle extends CountInc { private static LazySingle instance; private LazySingle() { } public static synchronized LazySingle getInstance() { if (instance == null) { instance = new LazySingle(); } return instance; } } static public class StarveSingle extends CountInc { private static StarveSingle instance = new StarveSingle(); private StarveSingle() { } public static StarveSingle getInstance() { return instance; } } static enum SINGLE { INSTANCE; private static volatile long count = 0; public void action() { count++; } } static class LazySingleTest extends Test { public LazySingleTest(String id, CyclicBarrier barrier, long count, int threadNum, ExecutorService executor) { super(id, barrier, count, threadNum, executor); } @Override protected void test() { LazySingle.getInstance().action(); } } static class StarveSingleTest extends Test { public StarveSingleTest(String id, CyclicBarrier barrier, long count, int threadNum, ExecutorService executor) { super(id, barrier, count, threadNum, executor); } @Override protected void test() { StarveSingle.getInstance().action(); } } static class EnumSingleTest extends Test { public EnumSingleTest(String id, CyclicBarrier barrier, long count, int threadNum, ExecutorService executor) { super(id, barrier, count, threadNum, executor); } @Override protected void test() { SINGLE.INSTANCE.action(); } } static void testPerformanceTemplate(String id, long count, int threadNum, final ExecutorService executor) { final CyclicBarrier barrier = new CyclicBarrier(threadNum + 1, new Thread() { @Override public void run() { // System.err.println("-----------------"); } }); System.out.println("=============================="); System.out.println("count = " + count + "/t" + "Thread Count = " + threadNum); new LazySingleTest("LazySingleTest ", barrier, count, threadNum, executor).startTest(); new StarveSingleTest("StarveSingleTest ", barrier, count, threadNum, executor).startTest(); new EnumSingleTest("EnumSingleTest ", barrier, count, threadNum, executor).startTest(); executor.shutdownNow(); System.out.println("=============================="); } private static int COUNT = 1000000; private static int THREAD_NUM = 10; public static void main(String[] args) { for (int i = 1; i < 5; i++) { ExecutorService executor = Executors.newFixedThreadPool(THREAD_NUM * i); testPerformanceTemplate(null, COUNT * i, THREAD_NUM * i, executor); } } }
结果
============================== count = 1000000 Thread Count = 10 LazySingleTest = 4718 StarveSingleTest = 766 EnumSingleTest = 766 ============================== ============================== count = 2000000 Thread Count = 20 LazySingleTest = 18656 StarveSingleTest = 3078 EnumSingleTest = 3047 ============================== ============================== count = 3000000 Thread Count = 30 LazySingleTest = 41672 StarveSingleTest = 6922 EnumSingleTest = 6843 ============================== ============================== count = 4000000 Thread Count = 40 LazySingleTest = 65344 StarveSingleTest = 12328 EnumSingleTest = 12328 ==============================
相关文章推荐
- Java设计模式(四):原型模式深拷贝的两种实现方式,以及和new对象的性能测试对比
- 单例模式简单解析--Singleton 单例模式(懒汉方式和饿汉方式)
- Singleton 单例模式(懒汉方式和饿汉方式)
- 使用JMeter进行性能测试 —“Java请求”方式
- Unity3D的Delegate和SendMessage的性能差测试,以及Delegate在多线程使用要注意的小问题
- Singleton 单例模式(懒汉方式和饿汉方式)
- Singleton 单例模式(懒汉方式和饿汉方式)
- Singleton 单例模式(懒汉方式和饿汉方式)
- Singleton 单例模式(懒汉方式和饿汉方式)
- android TraceView使用以及listview 的性能优化测试(二)
- Unity3D的Delegate和SendMessage的性能差测试,以及Delegate在多线程使用要注意的小问题
- Singleton 单例模式(懒汉方式和饿汉方式)
- 单例模式(懒汉方式和饿汉方式)
- 单例模式的实现之懒汉,饿汉,双重校验锁,枚举和静态内部类以及单例模式的应用情景
- Singleton 单例模式(懒汉方式和饿汉方式)
- Unity3D--Delegate和SendMessage的性能差测试,以及Delegate在多线程使用要注意的小问题
- 单例模式(懒汉方式和饿汉方式)
- 纯python实现的web: tornado性能测试以及实际使用解析
- 性能测试工具的使用方式
- 0.ring3-性能测试工具perfmon的使用方式