忍者ブログ
  • 2017.09
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 2017.11
Cより速いjava (2)
前回のjavaのパフォーマンスを検証していてあることに気づきました。

私はtest関数をコンパイルしてから実行しているのではと考えましたが



class B extends bench { int get() { return 1;} }
class C extends bench { int get() { return 2;} }
 
abstract public class bench {
  abstract int get();
  public static void main(String args[]) {
    bench f = new B();
    bench f2 = new C();
    int sum=0;
    sum = bench.test(f, f2);
    System.out.println(sum);
  }
 
  static int test(bench f1, bench f2) {
    int sum=0;
    bench f=f1;
    forint i=0; i<1000000000; i++ )
    {
      if(i>=10000000)<--ここを変えてみる
      {
        f = f2;
      }
      sum+=f.get();
    }
    return sum;
  }
}


ケース1:(i>=10000):1.949s
ケース2:(i>=100000000):3.973s
ケース3:(i>=500000000):2.756s
ケース4:(i>=999990000):1.145s
ケース5:(i==500000000):1.682s

驚くべきことに、ケース3よりもケース5の方が速いのです。

これは、もしかしてfに値を設定してからf.getが呼ばれる度に
リコンパイルされているとかなのかな?


ちまたでは、C vs javaとかありますが・・
比較できるわけないなぁと。

ちなみにCの(-O2)だと
ケース1~ケース4が2.7sあたり
ケース5が3.2sです。

Cの場合、for文を不等号で分割してif文が消えて速くなっていると考えられます。
等号の場合は、if文が残り・・
って君はSQLかと(笑)
PR
【2011/12/10 11:31 】 | java | 有り難いご意見(3) | トラックバック(0)
                                    
<<Cより速いjava (2)改訂版 | ホーム | Cより速いjava>>
有り難いご意見
無題
Cのほうの差はマシン語があるかないかでした・・
(1)==なら代入は3つのマシン語
cmpl $500000001, %ebx
jne .L9
movl 28(%esp), %edx

(2)>=なら代入は1つのマシン語
cmovge 28(%esp), %esi

jmp命令>演算命令なのかな。
奥が深い・・
【2011/12/10 22:06】| | nwpfh #29ef1c77e8 [ 編集 ]


無題
そこで論理反転のコードを書いてみて最適化のオプションを変えてみるというのはいかがでしょうか♪

 同じコードが生成されるかどうかなんて。

RTLからの最適化は如何に?

   ( ̄- ̄;←自分の興味を他人にふるヤツ
【2011/12/10 22:26】| URL | ゼンガイチ #2ac02652f5 [ 編集 ]


無題
こういうの??反転したけど
アセンブラの論理反転の検証するほど
いいマシンではないっ(なぜか威張る
秒なんて似た感じ。
--- bench.s 2011-12-10 22:34:52.022305568 +0900
+++ gtbench.s 2011-12-10 21:39:36.441864497 +0900
@@ -45,7 +45,7 @@
.cfi_offset 7, -12
pushl %esi
pushl %ebx
- movl $999999999, %ebx
+ xorl %ebx, %ebx
.cfi_offset 3, -20
.cfi_offset 6, -16
andl $-16, %esp
@@ -62,14 +62,14 @@
.p2align 4,,7
.p2align 3
.L5:
- cmpl $499999999, %ebx
- cmovle 28(%esp), %esi
- subl $1, %ebx
+ cmpl $500000000, %ebx
+ cmovge 28(%esp), %esi
+ addl $1, %ebx
movl (%esi), %eax
movl %esi, (%esp)
call *(%eax)
addl %eax, %edi
- cmpl $-1, %ebx
+ cmpl $1000000000, %ebx
jne .L5
movl %edi, 8(%esp)
movl $.LC0, 4(%esp)
【2011/12/10 22:42】| | nwpfh #29ef1c77e8 [ 編集 ]


貴重なご意見の投稿














虎カムバック
トラックバックURL

<<前ページ | ホーム | 次ページ>>