问题标签 [specialized-annotation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
6610 浏览

performance - 为什么 Scala 的标准库中 @specialized 的东西这么少?

我在@specializedScala 2.8.1的标准库的源代码中搜索了使用。看起来只有少数特征和类使用此注释:Function0, Function1, Function2, Tuple1, Tuple2, Product1, Product2, AbstractFunction0, AbstractFunction1, AbstractFunction2

集合类都不是@specialized. 为什么不?这会产生太多的类吗?

这意味着使用原始类型的集合类是非常低效的,因为会有很多不必要的装箱和拆箱。

拥有 s的不可变列表或序列(具有IndexedSeq特征)的最有效方法是什么Int,避免装箱和拆箱?

0 投票
1 回答
515 浏览

scala - 实现固定大小、不可变和专用向量

为了性能和安全性,我想实现一个固定大小的向量,它既不可变又专门化(我需要快速算术)。我的第一个想法是使用@specialized注释(因为我需要整数和实数)。

这是第一次尝试:

但是,当我用 分析生成的字节码时javap,我可以看到元素仍然被装箱。例如:

看起来数组不是专门的,这看起来很傻,因为数组是专门在 JVM 上的。

我还能做些什么来达到我的目标吗?

0 投票
2 回答
929 浏览

scala - 如何通过反射获取Scala专用的字段参数的原始数据类型?

我有一个类,该类具有专门的字段并且使用原始数据类型。例如 Tuple2[Int, String]:

我现在想使用反射来找出我的“refl”实例中 Tuple2 的类型参数。(我用'head'作弊来获得这个领域,因为我知道它是唯一的。)

现在我有了该字段,我可以查询泛型类型。

现在的问题是第一个类型是Object。有没有办法仅通过反射知道该参数的真实类型(Int)?

更新:

我在我自己的 API 中的自动序列化上下文中使用它。给定一个标有@Serializable 的类,我可以对其进行序列化。为此,我必须使用反射递归地构建类的字段和类型的树,以便进行深度序列化。

如果我直接使用 @Specialized 类,它可以工作,因为类型是显式的并且在调用站点的编译时已知。如果层次结构中的字段是@specialized,我无法通过反射来判断。查询类中声明的字段或方法不会产生正确的值。该类型存在于运行时,但仅存在于字段中保存的实例上,而不存在于字段本身的声明中。因此,如果实例为空并且不能执行“getClass”,我无法仅通过反射知道正确的类型。

0 投票
4 回答
5778 浏览

java - Scala(或Java)中泛型函数的专业化

是否可以在 Scala 中专门化泛型函数(或类)?例如,我想编写一个将数据写入 ByteBuffer 的通用函数:

但是由于 put 方法只需要一个字节并将其放入缓冲区,因此我需要将其专门用于 Ints 和 Longs,如下所示:

它不会编译。当然,我可以分别编写 3 个不同的函数 writeByte、writeInt 和 writeLong,但假设数组还有另一个函数:

如果没有专门的 writeData 函数,这将无法工作:我将不得不部署另一组函数 writeByteArray、writeIntArray、writeLongArray。每当我需要使用依赖于类型的写入函数时,必须以这种方式处理这种情况并不酷。我做了一些研究,一种可能的解决方法是测试参数的类型:

这可能有效,但效率较低,因为类型检查是在运行时完成的,这与专用函数版本不同。

所以我的问题是,在 Scala 或 Java 中解决此类问题的最理想和首选的方法是什么?我提前感谢您的帮助!

0 投票
2 回答
359 浏览

scala - scala 专门的通用数值运算

我想要一个封装整数和浮点数的类。

基本上我希望能够做这样的事情

带有编译器错误的代码。

- - 错误 - -

:11: 错误:类型不匹配;发现:T 必需:字符串常量(this.value + that.value)

(不知道为什么它解析为字符串 + 运算符)

0 投票
1 回答
213 浏览

scala - 使用 Scala 进行模式匹配

我有一个必须使用 Double 和 Float 的课程。由于性能要求,我使用带有@specialized注释的泛型。(Double, Float)我需要调用两个第三方函数。ffunc(x: Float)接受Floatdfunc(y: Double)接受Double。在某些时候,我必须调用ffuncdfunc。为此,我使用 scala 模式匹配。我的代码如下所示:

但是,scala 编译器为专用版本提供了未优化的字节码。当我查看专用类的字节码时,我看到了将我的专用类型转换为对象的非优化匹配代码。还有额外的装箱/拆箱如下:

您能否建议将匹配代码替换为将被优化并避免装箱/拆箱的代码?

0 投票
0 回答
60 浏览

scala - 函数上的 Scala @specialized 注释不会在模式匹配中生成专门的类型

我在scala中有以下函数,我打算用它来将任何可遍历的转换为数组并用数组包装任何不可遍历的:

此后添加了 @specialized 注释以规避https://issues.scala-lang.org/browse/SI-6967。即 scala 2.10 中的一个错误,其中原始类型可能无法进行模式匹配。

但是,编译器给了我以下错误:

这很奇怪,因为 v: T 在专门的实现中应该是一个双类型变量(而不是 Any)。我哪里做错了?

0 投票
0 回答
104 浏览

scala - 是否有可能在scala中获得专门值类的效果?

我知道@specialized类和值类是如何工作的,并且我知道我不能有一个专门的值类,例如:

我找不到获得类似效果的方法:使用单个声明创建一个用户类型/类型构造函数,它可以作为几个 java 原语的纯句法包装器 - 是否可以解决这个限制?

值类背后的主要动机之一是用业务意义“注释”值类型并创建与其数据类型不同的类型:

只要您静态地知道盒装类型,这就会非常有效,但是如果您想将几个不同的基元视为毫伏,您可以选择为每个基元创建一个新的包装器,或者对它们的设计使用泛型至:

这一切都很甜蜜,并且确实of在编译时删除了包装器,但不幸的是,原语被装箱到它们的 java 包装器中,并且这两个字段被编译为:

而不是longint领域。

是否可以编写以下代码:

  • 允许使用单个声明创建新的此类包装器(新的“单元”类型);
  • 至少在底层原语方面对此类包装器执行通用操作(以毫伏为单位的方法,从盒装原语中抽象出来);
  • 当包装器类型和底层原始类型都被完全实例化(不是泛型类型的类型参数)并且可以内联调用的方法时不执行装箱(所以我可以为所有当前和未来的单元定义一次添加)
  • 理想情况下不依赖于客户端代码中的宏(实现中的使用很好,只要类型声明本身可以被 IDE 理解)
0 投票
1 回答
130 浏览

scala - scala中不允许@specialized +内部类?

当我编译以下内容时:

然后 scala 会出现以下错误。

如果将 TTBase 和 TTX 移至包范围,则可以正常编译。scala(2.11)的内部类中不允许专门化吗?

0 投票
0 回答
25 浏览

scala - @specialized 在模板库中受益,其中模板参数在调用时已知?

假设我有:

装箱/拆箱是否会在以下任何一种情况下发生,@specialized 会避免它吗?

如果没有专门化,对 d2.apply 的调用会收到 Double 还是 Object?

可行:

  • 前者因为编译器可以在编译时证明,apply方法的类型是double。

  • 后者是因为 DoubleNormalizer.apply(Double) 是 Normalizer.apply(Object) 的实现,而 apply(Object) 是 JVM 将提供的唯一具体类型签名。