6

Collection.size または collection.lengthおよびScala Buffer: Size or Length?を呼び出すための最良の Scala 規則は? .

しかし、それはそれらが同じであることを意味しますか?

私に意見を述べたり、同一性についての希望に満ちた概念を提供したりしないでください。それらが実際に同じでない場合は教えてください。

ハードサイエンスであなたの主張をバックアップしてください!

バイトコードで十分です。私は JIT 固有の最適化にはあまり興味がありません。

私は世界の現状、つまり最近のマイルストーンにおける Scala 2.11 に特に興味があります。

4

1 に答える 1

8

String と Array は 2.11 でもサイズがラップされます。

とタイプするように指を訓練する必要がs.lengthありますarr.length

文字列と配列の両方に長さがあるため、これは難しいことではありません。

Java から Scala に移行する人は、メソッドを使用するjava.lang.Stringか、便利な拡張機能を使用するかを決定することがよくあります。休憩室からドーナツを補充する必要があるまでの「意思決定予算」は限られているため、ポリシーの問題として、これらの決定のいくつかを前もって行う価値があります。

昼食時やドーナツを食べながら話し合うのに勝るものがない場合:

22: invokevirtual #41                 // Method scala/Predef$.augmentString:(Ljava/lang/String;)Ljava/lang/String;
25: invokespecial #44                 // Method scala/collection/immutable/StringOps."<init>":(Ljava/lang/String;)V
28: invokevirtual #47                 // Method scala/collection/immutable/StringOps.size:()I


18: invokevirtual #39                 // Method scala/Predef$.intArrayOps:([I)Lscala/collection/mutable/ArrayOps;
21: invokeinterface #44,  1           // InterfaceMethod scala/collection/mutable/ArrayOps.size:()I

待って、待って、-optimise を使用すると、augmentString が失われる可能性があります。

と「同じ結果が得られる」ことGenSeqLikeを導入および指定するのはです。 そのように実装します。lengthsizeSeqLike

実際、 aへの拡張によってメソッドをString取得します。具体的には、です。それにはラッピングが必要です。実際、どの呼び出しでラッピングが必要か、または拡張メソッドへのディスパッチが必要かを予測するのは簡単ではありません。sizeSeqLikeStringLike

たとえば、lengthはラッピングが不要な方法で定義されています。StringOps値クラスだからです。実際、コンパイルするとString.length.

ただし、配列 apply を模倣するための呼び出しとして定義されているapplyメソッド onは、同じ方法で定義されていますが、拡張メソッドを呼び出します。StringOpscharAt

(もちろん、いくつかのオペコードと割り当ては、JIT コンパイルの後ではあまり意味がないかもしれません。)

scala> val s = "hello"
s: String = hello

scala> val n = s.length ; val i = s.size ; val c = s(4) ; s.slice(0,4)
n: Int = 5
i: Int = 5
c: Char = o
res0: String = hell

scala> :javap -prv -
  public $line4.$read$$iw$$iw$();
    flags: ACC_PUBLIC
    Code:
      stack=5, locals=7, args_size=1
         0: aload_0       
         1: invokespecial #32                 // Method java/lang/Object."<init>":()V
         4: aload_0       
         5: putstatic     #34                 // Field MODULE$:L$line4/$read$$iw$$iw$;
         8: aload_0       
         9: getstatic     #39                 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$;
        12: invokevirtual #42                 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String;

length:

        15: invokevirtual #47                 // Method java/lang/String.length:()I
        18: putfield      #22                 // Field n:I
        21: aload_0     

new StringOps、またはStringOops:

        22: new           #49                 // class scala/collection/immutable/StringOps
        25: dup           
        26: getstatic     #54                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
        29: getstatic     #39                 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$;
        32: invokevirtual #42                 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String;
        35: astore_2      
        36: astore_1      
        37: aload_2       

StringOps.size:

        38: invokespecial #57                 // Method scala/collection/immutable/StringOps."<init>":(Ljava/lang/String;)V
        41: invokevirtual #60                 // Method scala/collection/immutable/StringOps.size:()I
        44: putfield      #25                 // Field i:I
        47: aload_0       
        48: getstatic     #65                 // Field scala/collection/immutable/StringOps$.MODULE$:Lscala/collection/immutable/StringOps$;
        51: getstatic     #54                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
        54: getstatic     #39                 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$;
        57: invokevirtual #42                 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String;
        60: astore        4
        62: astore_3      
        63: aload         4
        65: iconst_4      

apply延長方法:

        66: invokevirtual #69                 // Method scala/collection/immutable/StringOps$.apply$extension:(Ljava/lang/String;I)C
        69: putfield      #28                 // Field c:C
        72: aload_0       
        73: getstatic     #65                 // Field scala/collection/immutable/StringOps$.MODULE$:Lscala/collection/immutable/StringOps$;
        76: getstatic     #54                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
        79: getstatic     #39                 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$;
        82: invokevirtual #42                 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String;
        85: astore        6
        87: astore        5
        89: aload         6
        91: iconst_0      
        92: iconst_4      

slice:

        93: invokevirtual #73                 // Method scala/collection/immutable/StringOps$.slice$extension:(Ljava/lang/String;II)Ljava/lang/String;
        96: putfield      #31                 // Field res0:Ljava/lang/String;
        99: return   
于 2013-11-07T01:50:15.183 に答える