HikariCP Druid比較

HikariCP Github地址: https://github.com/brettwooldridge/HikariCPcss

HikariCP是數據庫鏈接池,並且是號稱史上最快的, SpringBoot2.0也已經採用HikariCP做爲默認鏈接池配置.git

HikariCP爲何這麼快

1.1 代碼量很是小:
要知道對於鏈接池來說,代碼越少,佔用cpu和內存越少,Bug出現概率也是越小,那麼表明他的執行率高,這就是爲何HikariCP受歡迎的緣由之一
1.2 穩定性,可靠性強:
HikariCP是經受了市場的考驗,走過太上老君的丹爐,現現在拿到SpringBoot的入場證,走上了人生巔峯.
1.3 速度奇快:
光有健壯性可不行,坦克很健壯,卻跑不過飛機,可是HikariCP卻依靠本身的代碼少,重寫數據結構等特色,成功晉級速度最快鏈接池冠軍寶座github

HikariCP快得益於:
1.1 優化並精簡字節碼 1.2 使用FastList替代ArrayList 1.3 ConcurrentBag:更好的併發集合類實現
鏈接池的FastList源碼:
/** * 沒有列表檢查的 FastList。 * * @author Brett Wooldridge */
public final class FastList<T> implements List<T>, RandomAccess, Serializable { private static final long serialVersionUID = -4598088075242913858L; private final Class<?> clazz; private T[] elementData; private int size; /** * 構建一個默認大小爲32的列表。 * @param clazz the Class stored in the collection */ @SuppressWarnings("unchecked") public FastList(Class<?> clazz) { this.elementData = (T[]) Array.newInstance(clazz, 32); this.clazz = clazz; } /** * 構造具備指定大小的列表。 * @param clazz the Class stored in the collection * @param capacity the initial size of the FastList */ @SuppressWarnings("unchecked") public FastList(Class<?> clazz, int capacity) { this.elementData = (T[]) Array.newInstance(clazz, capacity); this.clazz = clazz; } @Override public boolean add(T element) { //給 list添加屬性 //若是 size值小於 初始化的值
      if (size < elementData.length) { elementData[size++] = element; } else { // 溢出的代碼 //elementData 原始32不夠用 須要擴容
         final int oldCapacity = elementData.length; final int newCapacity = oldCapacity << 1; @SuppressWarnings("unchecked") //擴容集合
         final T[] newElementData = (T[]) Array.newInstance(clazz, newCapacity); //數組複製
         System.arraycopy(elementData, 0, newElementData, 0, oldCapacity); //屬性賦值
         newElementData[size++] = element; elementData = newElementData; } return true; } /* * 我複製ArrayList的get代碼 來看看爲何 FastList 更快 * public E get(int index) { * rangeCheck(index); * return elementData(index); * } * 多出了rangeCheck 檢查角標範圍 節省時間 */ @Override public T get(int index) { return elementData[index]; } /* * 這個是ArrayList的 remove()代碼 FastList 少了檢查範圍 和 從頭至尾的 檢查元素動做 性能更快 * rangeCheck(index); * modCount++; * E oldValue = elementData(index); */ @Override public boolean remove(Object element) { for (int index = size - 1; index >= 0; index--) { if (element == elementData[index]) { final int numMoved = size - index - 1; //若是角標不是最後一個 copy一個新的數組結構
            if (numMoved > 0) { System.arraycopy(elementData, index + 1, elementData, index, numMoved); } //若是角標是最後面的 直接初始化爲null
            elementData[--size] = null; return true; } } return false; }

 

ArrayList不但先進行檢查角標範圍,並且還從頭到腳進行掃描元素,而FastList的get和remove方法擯棄了這一作法。數據庫

HikariCP在優化並精簡字節碼上也下了功夫,使用第三方的Java字節碼修改類庫Javassist來生成委託實現動態代理.動態代理的實如今ProxyFactory類,速度更快,相比於JDK Proxy生成的字節碼更少,精簡了不少沒必要要的字節碼.數組

相關文章
相關標籤/搜索