java - 性能偏执狂 : how much expensive are Float. parseFloat(String), Integer.parseInt(String)?

标签 java performance interface types casting

我最近在使用JSON存储同一个类的一定数量的子类的配置参数。为了保持统一的接口(interface),我为父类提供了 public void setParameter(String, String)String getParameter(String) 方法。然后,每个子类将提供的参数转换为它们的 native 类型,并使用它们进行某种计算。

现在,我想知道:既然我已经将每个参数存储在一个 HashMap 中,那么为每个参数保留一个具有正确类型的单独字段真的有意义吗?考虑到我需要经常使用它们,每次需要时将字符串参数转换为其 native 类型的计算开销是多少?

谢谢
通努兹

最佳答案

我建议你测试一下。如果您需要多次执行此操作,这是一个相当昂贵的操作,但如果您首先使用它们来创建数据,它可能比 Double.toString() 或 Integer.toString() 更便宜。

我还建议您只使用 double 除非您知道使用 float 永远不会导致舍入问题。 ;)

它与创建对象(如 String 或向 HashMap 添加条目)一样昂贵。除非您也打算避免这样做,否则我不会担心。

编辑:与@Stackers 的基准测试类似,我会更长时间地运行测试并使用 nanoTime()

int runs = 10000000;
String val = "" + Math.PI;
long start = System.nanoTime();
for (int i = 0; i < runs; i++)
    Float.parseFloat(val);
long time = (System.nanoTime() - start) / runs;
System.out.println("Average Float.parseFloat() time was " + time + " ns.");

long start2 = System.nanoTime();
for (int i = 0; i < runs; i++)
    Double.parseDouble(val);
long time2 = (System.nanoTime() - start2) / runs;
System.out.println("Average Double.parseDouble() time was " + time2 + " ns.");

打印

Average Float.parseFloat() time was 474 ns.
Average Double.parseDouble() time was 431 ns.

顺便说一句:我有一个函数可以从一个直接的 ByteBuffer 中读取 double 值,这需要 80 ns。它更快,因为它不需要 String 并且不创建任何对象。但是,这样做绝非易事,您必须设计核心系统以避免创建任何对象。 ;)

关于java - 性能偏执狂 : how much expensive are Float. parseFloat(String), Integer.parseInt(String)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5549021/

相关文章:

java - 句子中元音的降序排列

java - 如何获取 jms 消息源的 jndi 名称

java - 我应该如何提高这段代码的缓存友好性? (3D 复数数组到 2D 矩阵的 1D 数组)

c++ - 在 C++ 中复制和操作大型密集二维数组的最快方法是什么

java - 如何在 Eclipse 中高效地处理大型 Maven 项目工作区?

go - Stringer 方法需要值

ios - iOS 中 objective-c 中的属性错误

java - 如何在 JFrame 可见后将其添加到组件中,而无需调整其大小?

java - 用 `watch` 解析命令 `InputStream`

delphi - 我不知道是否需要或如何实现接口(interface)的这 3 个基本方法