gpt4 book ai didi

scala - Scala中的有效标量图/成语?

转载 作者:行者123 更新时间:2023-12-04 05:08:51 28 4
gpt4 key购买 nike

访问标量表达式的最简洁和字节码有效的方法是什么 多次从另一个表情的深处?

以下代码中的所有函数(例如 scalar4 )都可以根据需要运行。但只有 字节编码器 发出高效的字节码(尽管它以 ISTORE 2 ILOAD 2 结尾很糟糕),其他的每个生成六个 INVOKE。

这个习惯用法对于传递元组的任意部分作为参数也很方便:

for (a_tuple) { f(_._3, _._1) + g(_._2) }  // caution NOT legal Scala

在此示例中 介绍 表示只应调用一次的昂贵函数。
object Hack extends App
{
@inline final def fur[T, V](x :T)(f :T => V) :V = f(x)

@inline final def pfor[T, V](x :T)(pf :PartialFunction[T, V]) = pf(x)

@inline final def cfor[T, V](x :T)(f :T => V) :V = x match { case x => f(x) }

def intro :Int = 600 // only one chance to make a first impression

def bytecoder = intro match { case __ => __ + __ / 600 }

def functional = fur(intro) (x => x + x / 600)

def partial = pfor(intro) { case __ => __ + __ / 600 }

def cased = cfor(intro) ($ => $ + $ / 600)

def optional = Some(intro).map(? => ? + ? / 600).get

def folder = Some(intro).fold(0)(? => ? + ? / 600)

// the for I wish for
def scalar4 = for(intro) (_ + _ / 600) // single underline!

println(bytecoder, functional, partial, cased, optional, folder)
}

公共(public)字节编码器()我
ALOAD 0
INVOKEVIRTUAL com/_601/hack/Hack$.intro ()I
ISTORE 1
ILOAD 1
ILOAD 1
SIPUSH 600
IDIV
IADD
ISTORE 2
ILOAD 2
IRETURN

最佳答案

只需使用临时 val 创建一个本地 block 。严重地。它很紧凑:只比“惯用”管道长一个字符

{ val x = whatever; x * x / 600 }
whatever match { case x => x * x / 600 }
whatever |> { x => x * x / 600 }

它很有效:可能的最小字节码。
// def localval = { val x = whatever; x * x / 600 }
public int localval();
Code:
0: aload_0
1: invokevirtual #18; //Method whatever:()I
4: istore_1
5: iload_1
6: iload_1
7: imul
8: sipush 600
11: idiv
12: ireturn

它唯一不做的就是充当后缀运算符,而你有 match当你真的需要这种形式并且不能容忍额外的字节码时。

关于scala - Scala中的有效标量图/成语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15145427/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com