性能優(yōu)化之拋棄Calendar

目前在做限流相關(guān)的需求课竣,有這么一個限流策略童太,和用戶相關(guān),當系統(tǒng)發(fā)生故障時栓始,允許一個非核心接口按照用戶的百分比進行限流务冕,如果完全按照UUID進行hash,那么每次都是限制同一批的用戶幻赚,如果在UUID的基礎(chǔ)上加上當天的日期禀忆,那么就可以有效的避免這個問題。

所以在這個需求中落恼,每次請求都需要拿到當前的日期箩退,不過精確到天即可。
嗖~的一下佳谦,完成了如下代碼

Calendar calendar = Calendar.getInstance();
String time = "" + calendar.get(Calendar.YEAR) + calendar.get(Calendar.MONTH) +calendar.get(Calendar.DAY_OF_MONTH);

很簡單是不是戴涝,不過寫完之后,很快就被業(yè)務(wù)同學(xué)diss了,Calendar性能太差了啥刻,在QPS很高的情況下奸鸯,會使接口的999線劣化。

QPS高的業(yè)務(wù)真是惹不起... (丟)

為什么Calendar不行郑什,因為每次請求都要創(chuàng)建一個Calendar實例府喳,這個創(chuàng)建過程比較的耗時(qps低的時候可以忽略這種消耗),但是做基礎(chǔ)組件的蘑拯,應(yīng)該考慮各種場景。

因為只需要獲取到與天相關(guān)數(shù)據(jù)兜粘,所以想到了另一個簡單的解決方案

private static final int DAY_MILLIS = 24 * 60 * 60 * 1000;
long day = System.currentTimeMillis() / DAY_MILLIS;

通過當前的時間戳(毫秒級別)申窘,除以一天的毫秒數(shù),得到的結(jié)果就是從1970 到今天經(jīng)歷過的天數(shù)孔轴,這完全符合當前的需求剃法。

這個解決方案,只是恰好可以滿足這種需求路鹰,對于其它更復(fù)雜一點的需求贷洲,我這里推薦使用Joda Time組件。

下面通過Openjdk的JMH類庫晋柱,對上述三種情況進行性能基準測試优构,還沒有接觸過JMH的同學(xué),可以在官網(wǎng)上進行學(xué)習(xí)雁竞,傳送門

@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
public class Main {

    static int millis = 24 * 3600 * 1000;

    public static void main(String[] args) throws Exception {
        Options options = new OptionsBuilder().include(Main.class.getName()).forks(1).build();
        new Runner(options).run();
    }

    @Benchmark
    @Threads(5)
    public void runCalendar() {
        Calendar calendar = Calendar.getInstance();
    }

    @Benchmark
    @Threads(5)
    public void runJoda() {
        DateTime dateTime = new DateTime();
    }

    //
    @Benchmark
    @Threads(5)
    public void runSystem() {
        long result = System.currentTimeMillis() / millis;
    }
}

使用benchmark之前钦椭,需要引入相關(guān)依賴

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-core</artifactId>
    <version>1.21</version>
</dependency>
<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>1.21</version>
    <scope>provided</scope>
</dependency>

最終結(jié)果如下

這里只是測試了Calendar和Joda對象的創(chuàng)建耗時,可以發(fā)現(xiàn)Joda的性能比Calendar整整高了10倍碑诉,真的不可忽略彪腔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市进栽,隨后出現(xiàn)的幾起案子德挣,更是在濱河造成了極大的恐慌,老刑警劉巖快毛,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件格嗅,死亡現(xiàn)場離奇詭異,居然都是意外死亡祸泪,警方通過查閱死者的電腦和手機吗浩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來没隘,“玉大人懂扼,你說我怎么就攤上這事。” “怎么了阀湿?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵赶熟,是天一觀的道長。 經(jīng)常有香客問我陷嘴,道長映砖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任灾挨,我火速辦了婚禮邑退,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘劳澄。我一直安慰自己地技,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布秒拔。 她就那樣靜靜地躺著莫矗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砂缩。 梳的紋絲不亂的頭發(fā)上作谚,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音庵芭,去河邊找鬼妹懒。 笑死,一個胖子當著我的面吹牛喳挑,可吹牛的內(nèi)容都是我干的彬伦。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼伊诵,長吁一口氣:“原來是場噩夢啊……” “哼单绑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曹宴,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤搂橙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笛坦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體区转,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年版扩,在試婚紗的時候發(fā)現(xiàn)自己被綠了废离。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡礁芦,死狀恐怖蜻韭,靈堂內(nèi)的尸體忽然破棺而出悼尾,到底是詐尸還是另有隱情,我是刑警寧澤肖方,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布闺魏,位于F島的核電站,受9級特大地震影響俯画,放射性物質(zhì)發(fā)生泄漏析桥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一艰垂、第九天 我趴在偏房一處隱蔽的房頂上張望泡仗。 院中可真熱鬧,春花似錦材泄、人聲如沸沮焕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辣辫,卻和暖如春旦事,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背急灭。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工姐浮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人葬馋。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓卖鲤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親畴嘶。 傳聞我的和親對象是個殘疾皇子蛋逾,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容