netty-FastThreadLocal用法测试

本文通过一个测试例子,对比了Netty中FastThreadLocal与标准ThreadLocal的性能。测试结果显示,在大量并发请求和多次调用get方法的情况下,FastThreadLocal表现出更好的性能。

2017年写Netty相关文章的时候,关于Netty中FastThreadLocal.java源码解读的文章还很少。今天(2019-02-25)回头过来整理的时候,发现网上已经涌现出了许多篇介绍FastThreadLocal.java的文章,并且,已经有解读的比较详实的文章,所以本人已经不打算进一步分析源码了。此处暂且列出几篇优秀的博文供大家查阅。
1. Netty精粹之设计更快的ThreadLocal
2. Netty学习之旅----ThreadLocal原理分析与性能优化思考(思考篇)

下文将给出一个测试例子,用于比较ThreadLocal与FastThreadLocal的性能。

import io.netty.util.concurrent.FastThreadLocal;
import io.netty.util.concurrent.FastThreadLocalThread;
import org.junit.Test;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

public class FastThreadLocalTest {

    /**
     * 测试ThreadLocal运行耗时
     *
     * @param threadLocalCount ThreadLocal的对象数量
     * @param runCount         调用get方法的次数
     * @param value            ThreadLocal的局部变量值
     * @return
     * @author lihong10 2019/2/25 19:19
     * @modificationHistory=========================逻辑或功能性重大变更记录
     * @modify by user: {修改人} 2019/2/25 19:19
     * @modify by reason:{原因}
     */
    public static void testThreadLocal(int threadLocalCount, int runCount, String value) {
        final ThreadLocal<String>[] caches = new ThreadLocal[threadLocalCount];
        final Thread mainThread = Thread.currentThread();
        for (int i = 0; i < threadLocalCount; i++) {
            caches[i] = new ThreadLocal();
        }
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < threadLocalCount; i++) {
                    caches[i].set(value);
                }
                long start = System.nanoTime();
                for (int i = 0; i < threadLocalCount; i++) {
                    for (int j = 0; j < runCount; j++) {
                        caches[i].get();
                    }
                }
                long end = System.nanoTime();
                System.out.println(" thread local take[" + TimeUnit.NANOSECONDS.toMillis(end - start) +
                        "]ms");
                LockSupport.unpark(mainThread);
            }

        });
        t.start();
        LockSupport.park(mainThread);
    }


    /**
     * 测试FastThreadLocal运行耗时
     *
     * @param threadLocalCount FastThreadLocal的对象数量
     * @param runCount         调用get方法的次数
     * @param value            FastThreadLocal的局部变量值
     * @return
     * @author lihong10 2019/2/25 19:19
     * @modificationHistory=========================逻辑或功能性重大变更记录
     * @modify by user: {修改人} 2019/2/25 19:19
     * @modify by reason:{原因}
     */
    public static void testFastThreadLocal(int threadLocalCount, int runCount, String value) {
        final FastThreadLocal<String>[] caches = new FastThreadLocal[threadLocalCount];
        final Thread mainThread = Thread.currentThread();
        for (int i = 0; i < threadLocalCount; i++) {
            caches[i] = new FastThreadLocal();
        }
        Thread t = new FastThreadLocalThread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < threadLocalCount; i++) {
                    caches[i].set(value);
                }
                long start = System.nanoTime();
                for (int i = 0; i < threadLocalCount; i++) {
                    for (int j = 0; j < runCount; j++) {
                        caches[i].get();
                    }
                }
                long end = System.nanoTime();
                System.out.println("fast thread local take[" + TimeUnit.NANOSECONDS.toMillis(end - start) +
                        "]ms");
                LockSupport.unpark(mainThread);
            }

        });
        t.start();
        LockSupport.park(mainThread);
    }


    /**
     * 对比ThreadLocal和 FastThreadLocal的耗时
     * @author lihong10 2019/2/25 19:25
     * @param
     * @return
     * @modificationHistory=========================逻辑或功能性重大变更记录
     * @modify by user: {修改人} 2019/2/25 19:25
     * @modify by reason:{原因}
     */
    @Test
    public void test() {
        String value = "thread local value";
        testThreadLocal(1000, 1000000, value);
        testFastThreadLocal(1000, 1000000, value);
    }


}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值