第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

模運(yùn)算符和按位與的性能比較

模運(yùn)算符和按位與的性能比較

慕工程0101907 2021-05-07 18:23:40
我正在努力確定32位整數(shù)是偶數(shù)還是奇數(shù)。我設(shè)置了2種方法:模(%)法int r = (i % 2);按位(&)方法int r = (i & 0x1);兩種方法都可以成功工作。因此,我將每條線運(yùn)行15000次以測(cè)試性能。結(jié)果:模(%)方法(源代碼)平均141.5801887ns | SD 270.0700275ns按位(&)方法(源代碼)平均141.2504ns | SD 193.6351007ns問(wèn)題:為什么逐位(&)比除法(%)更穩(wěn)定?JVM是否根據(jù)此處使用AND(&)優(yōu)化取模(%)?
查看完整描述

3 回答

?
寶慕林4294392

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊

讓我們嘗試使用JMH復(fù)制。


@Benchmark

@Measurement(timeUnit = TimeUnit.NANOSECONDS)

@BenchmarkMode(Mode.AverageTime)

public int first() throws IOException {

    return i % 2;

}


@Benchmark

@Measurement(timeUnit = TimeUnit.NANOSECONDS)

@BenchmarkMode(Mode.AverageTime)

public int second() throws IOException {

    return i & 0x1;

}

好的,它是可復(fù)制的。的first速度略慢于second。現(xiàn)在讓我們找出原因。使用以下命令運(yùn)行它-prof perfnorm:


Benchmark                                 Mode  Cnt   Score    Error  Units

MyBenchmark.first                         avgt   50   2.674 ±  0.028  ns/op

MyBenchmark.first:CPI                     avgt   10   0.301 ±  0.002   #/op

MyBenchmark.first:L1-dcache-load-misses   avgt   10   0.001 ±  0.001   #/op

MyBenchmark.first:L1-dcache-loads         avgt   10  11.011 ±  0.146   #/op

MyBenchmark.first:L1-dcache-stores        avgt   10   3.011 ±  0.034   #/op

MyBenchmark.first:L1-icache-load-misses   avgt   10  ≈ 10?3            #/op

MyBenchmark.first:LLC-load-misses         avgt   10  ≈ 10??            #/op

MyBenchmark.first:LLC-loads               avgt   10  ≈ 10??            #/op

MyBenchmark.first:LLC-store-misses        avgt   10  ≈ 10??            #/op

MyBenchmark.first:LLC-stores              avgt   10  ≈ 10??            #/op

MyBenchmark.first:branch-misses           avgt   10  ≈ 10??            #/op

MyBenchmark.first:branches                avgt   10   4.006 ±  0.054   #/op

MyBenchmark.first:cycles                  avgt   10   9.322 ±  0.113   #/op

MyBenchmark.first:dTLB-load-misses        avgt   10  ≈ 10??            #/op

MyBenchmark.first:dTLB-loads              avgt   10  10.939 ±  0.175   #/op

MyBenchmark.first:dTLB-store-misses       avgt   10  ≈ 10??            #/op

MyBenchmark.first:dTLB-stores             avgt   10   2.991 ±  0.045   #/op

MyBenchmark.first:iTLB-load-misses        avgt   10  ≈ 10??            #/op

MyBenchmark.first:iTLB-loads              avgt   10  ≈ 10??            #/op

MyBenchmark.first:instructions            avgt   10  30.991 ±  0.427   #/op

MyBenchmark.second                        avgt   50   2.263 ±  0.015  ns/op

MyBenchmark.second:CPI                    avgt   10   0.320 ±  0.001   #/op

MyBenchmark.second:L1-dcache-load-misses  avgt   10   0.001 ±  0.001   #/op

MyBenchmark.second:L1-dcache-loads        avgt   10  11.045 ±  0.152   #/op

MyBenchmark.second:L1-dcache-stores       avgt   10   3.014 ±  0.032   #/op

MyBenchmark.second:L1-icache-load-misses  avgt   10  ≈ 10?3            #/op

MyBenchmark.second:LLC-load-misses        avgt   10  ≈ 10??            #/op

MyBenchmark.second:LLC-loads              avgt   10  ≈ 10??            #/op

MyBenchmark.second:LLC-store-misses       avgt   10  ≈ 10??            #/op

MyBenchmark.second:LLC-stores             avgt   10  ≈ 10??            #/op

MyBenchmark.second:branch-misses          avgt   10  ≈ 10??            #/op

MyBenchmark.second:branches               avgt   10   4.014 ±  0.045   #/op

MyBenchmark.second:cycles                 avgt   10   8.024 ±  0.098   #/op

MyBenchmark.second:dTLB-load-misses       avgt   10  ≈ 10??            #/op

MyBenchmark.second:dTLB-loads             avgt   10  10.989 ±  0.161   #/op

MyBenchmark.second:dTLB-store-misses      avgt   10  ≈ 10??            #/op

MyBenchmark.second:dTLB-stores            avgt   10   3.004 ±  0.042   #/op

MyBenchmark.second:iTLB-load-misses       avgt   10  ≈ 10??            #/op

MyBenchmark.second:iTLB-loads             avgt   10  ≈ 10??            #/op

MyBenchmark.second:instructions           avgt   10  25.076 ±  0.296   #/op

注意周期和說(shuō)明上的差異?,F(xiàn)在,這很明顯。該first很關(guān)心的跡象,但second不(只按位與)。為了確保這是原因,請(qǐng)看一下程序集片段:


第一的:


0x00007f91111f8355: mov     0xc(%r10),%r11d   ;*getfield i

0x00007f91111f8359: mov     %r11d,%edx

0x00007f91111f835c: and     $0x1,%edx

0x00007f91111f835f: mov     %edx,%r10d

0x00007f6bd120a6e2: neg     %r10d

0x00007f6bd120a6e5: test    %r11d,%r11d

0x00007f6bd120a6e8: cmovl   %r10d,%edx       

第二:


0x00007ff36cbda580: mov     $0x1,%edx

0x00007ff36cbda585: mov     0x40(%rsp),%r10

0x00007ff36cbda58a: and     0xc(%r10),%edx  


查看完整回答
反對(duì) 回復(fù) 2021-05-19
?
翻翻過(guò)去那場(chǎng)雪

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊

這兩個(gè)操作對(duì)應(yīng)于不同的JVM處理器指令:

irem     // int remainder (%)
iand     // bitwise and (&)

我讀過(guò)的某個(gè)地方irem通常由JVM實(shí)現(xiàn),而iand在硬件上可用。Oracle解釋了以下兩條指令:

iand

通過(guò)取值1和值2的按位與(連接)來(lái)計(jì)算int結(jié)果。

irem

整數(shù)結(jié)果為值1-(值1 /值2)*值2。

在我看來(lái),假設(shè)這樣做iand會(huì)減少CPU周期,這似乎是合理的。


查看完整回答
反對(duì) 回復(fù) 2021-05-19
  • 3 回答
  • 0 關(guān)注
  • 258 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)