【问题标题】:Speed comparison of two code两种代码的速度比较
【发布时间】:2015-02-18 07:41:58
【问题描述】:

我相信有很多类似的问题,如果这太常见了,对不起。我想了解哪个更好/更快/节省空间等以及为什么。

public static void(String[] main){
    //case 1
    String[] str_arr = new String[n];
    method1(str_arr)

    //case 2
    String[] str_arr = new String[n];
    String[] arr = new String[n];
    for(int i=0; i < n; i++){
        arr[i] = str_arr[i].split("some_char")[2];
    }
    method2(arr);
}

void method1(String[] str_arr){
    String[] arr = new String[n];
    for(int i=0; i < n; i++){
        arr[i] = str_arr[i].split("aChar")[2];//assume there are 50 of aChar 
    }
//  do_something with arr ;
}

void method2(String[] arr){
//  do_something with arr ;
}

我应该更喜欢哪一个?

提前致谢。

【问题讨论】:

  • 哪个更方便?
  • 拥有一个只调用一个方法的方法是没有意义的。
  • @immibis,如果两者相等,我会选择method1,因为main方法看起来更整洁。另外,我可能不需要创建String[] arr,我将创建一个String 并对其进行处理。
  • @jurgemaister,我编辑了代码,没注意那行。
  • 将您的split() 结果存储在一个新变量中,因为它适用于regexp,而regexp 非常慢。

标签: java performance pass-by-value


【解决方案1】:

这完全取决于您的判断。

说到性能方面的原因:

  • 尽可能使用增强的 for 循环,因为它们有时会影响循环性能(在此处查看一个不错的微基准:Java Enhanced-For-Loop FASTER than traditional?),或者...
  • 如果您不再需要原件,请不要创建额外的存储阵列。只需读取该值,将其拆分()并将其存储回来。在非常大的数组上,您可以节省一些分配时间和空间。
  • 在这个特定示例中,方法调用的实际成本可以忽略不计。如果您特别偏执(不推荐),您可以将方法设为静态以防止它成为 thiscall 函数。

在干净整洁的代码方面:

  • 您的方法看起来可能是通用的,因此它是一个很好的候选方法,只需要一个数组和分隔符,并拆分其所有元素。
  • 为方便起见,建议 main() 代码尽可能小而紧凑。

TL;DR 选择第一个选项,并最终进行一些修改。

此外,在将元素实际放入数组之前拆分元素可能是个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 2013-10-19
    • 2023-03-03
    • 2017-04-10
    相关资源
    最近更新 更多