相关疑难解决方法(0)

如何在Java中编写正确的微基准测试?

你如何在Java中编写(并运行)正确的微基准测试?

我在这里寻找代码示例和注释,说明要考虑的各种事项.

示例:基准测量应该测量时间/迭代或迭代/时间,为什么?

相关:秒表基准可以接受吗?

java benchmarking jvm jvm-hotspot microbenchmark

835
推荐指数
11
解决办法
11万
查看次数

lambda表达式是否在每次执行时都在堆上创建一个对象?

当我使用Java 8的新语法糖迭代一个集合时,例如

myStream.forEach(item -> {
  // do something useful
});
Run Code Online (Sandbox Code Playgroud)

这不等同于下面的"旧语法"片段吗?

myStream.forEach(new Consumer<Item>() {
  @Override
  public void accept(Item item) {
    // do something useful
  }
});
Run Code Online (Sandbox Code Playgroud)

这是否意味着Consumer每次迭代集合时都会在堆上创建一个新的匿名对象?这需要多少堆空间?它有什么性能影响?这是否意味着我在迭代大型多级数据结构时应该使用旧样式for循环?

java lambda java-8

166
推荐指数
2
解决办法
3万
查看次数

如何编译Java lambda函数?

Loop.times(5, () -> {
   System.out.println("looping");
});
Run Code Online (Sandbox Code Playgroud)

哪些有效编译到?

for(int i = 0; i < 5; i++)
    System.out.println("looping");
Run Code Online (Sandbox Code Playgroud)

或类似的东西

new CallableInterfaceImpl(){
    public void call(){
      for(int i = 0; i < 5; i++)
          System.out.println("looping");
    }
}.call();
Run Code Online (Sandbox Code Playgroud)

它会替换(内联类),还是实际创建一个匿名类?

java lambda java-8

54
推荐指数
2
解决办法
1万
查看次数

使用lambda表达式可以获得性能提升吗?

我需要检查两个列表中是否存在共同元素.我提出了两种方法来做到这一点:

方法01:循环

private boolean func01 (List<String> list1, List<String> list2) {
    for (String group : list1) {
        for (String funcGroup : list2) {
            if (group.equals(funcGroup)) {
                return true;
            }
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

方法02:Lambda

private boolean func02 (List<String> list1, List<String> list2) {
    return list1.stream().filter(list2::contains).findAny().isPresent();
}
Run Code Online (Sandbox Code Playgroud)

在我看来,我发现第一种方法更具可读性.我需要了解的是,比较这两种方法时是否存在差异或优势?

java performance lambda

10
推荐指数
1
解决办法
1778
查看次数

在Java中使用lambda表达式有任何运行时优势吗?

我正在阅读有关Java 8中提供的lambda表达式的两个博客和答案。

我无法弄清楚,单位lambda表达式是否对运行时有好处?

我从不同的来源复制了以下文本,这使我感到非常困惑。

一个答案是说-

“ lambda不会创建新的作用域,它们与封闭的块/环境共享相同的作用域”

在一个博客中-

“使用lambda表达式没有运行时的好处,所以我会谨慎使用它,因为我不介意写一些额外的代码行。”

从另一个博客-

“通过在方法中传递行为,又一个有益的lambda表达式顺序和并行执行支持”

所以对我来说,还有很多困惑。请帮助我清除此问题,以便在深入研究这些内容之前避免记住错误的方法。

我已经运行了以下代码,我可以说以下代码中的lambda表达式只是对匿名内部类及其在主线程上运行的替代。

List<Integer> list = new ArrayList<>();
list.add(12);
list.forEach(V -> {
    System.out.println(V);
});
Run Code Online (Sandbox Code Playgroud)

我们是在减少时间复杂度还是空间复杂度?

java lambda java-8

5
推荐指数
2
解决办法
983
查看次数

Kotlin lambdas 在底层与 Java lambdas 相同吗?

这是这个答案的后续问题。

但是当应用程序之前没有使用过 lambda 表达式时¹,甚至必须加载用于生成 lambda 类的框架(Oracle 当前的实现在幕后使用 ASM)。这是十几个内部使用的类的减速、加载和初始化的实际原因,而不是 lambda 表达式本身

好的,Java 使用 ASM 在运行时生成类。我发现了这一点,如果我理解正确的话,它基本上是说 Kotlin lambdas 被编译为在运行时加载(而不是生成)的预先存在的匿名类。

如果我是对的,Kotlin lambdas 与 Java 不同,不应该具有相同的性能影响。有人可以确认吗?

kotlin

1
推荐指数
1
解决办法
85
查看次数

Java 中的流比原生 for 循环慢得多 - 为什么?

据我所知,流比传统的旧编程更快。

但是,当我运行以下代码时,结果出乎我的意料。

public class Application {
    public static void main(String[] args) {
        long startTime = System.nanoTime();
        int[] a = { 1, 2, 3, 4 };
        int m = Arrays.stream(a).reduce(Integer.MIN_VALUE, Math::max);
        long endTime = System.nanoTime();
        long totalTime = endTime - startTime;
        System.out.println(totalTime);

    }
}
Run Code Online (Sandbox Code Playgroud)

输出为:22857304

public class Application {
        public static void main(String[] args) {
        long startTime = System.nanoTime();
        int[] a = { 1, 2, 3, 4 };
        int e = a.length;
        int m = Integer.MIN_VALUE;
        for (int i = 0; …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

0
推荐指数
1
解决办法
369
查看次数