2015-06-06 105 views
0

我有一个分裂的用户的年龄分为8组这样的Java代码:我如何优化这段代码以查看更高性能?

private int[] A0, A1, A2, A3, A4, A5, A6, A7, A8; 

    public Grouping() { 
     super(); 

     for (int i = 5; i < 10; i++) 
      A0[i] = i; 

     for (int i = 10; i < 20; i++) 
      A1[i] = i; 

     for (int i = 20; i < 30; i++) 
      A2[i] = i; 

     for (int i = 30; i < 40; i++) 
      A3[i] = i; 

     for (int i = 40; i < 50; i++) 
      A4[i] = i; 

     for (int i = 50; i < 60; i++) 
      A5[i] = i; 

     for (int i = 60; i < 70; i++) 
      A6[i] = i; 

     for (int i = 70; i < 80; i++) 
      A7[i] = i; 

     for (int i = 10; i < 20; i++) 
      A8[i] = i; 

    } 

现在我想优化这些代码。有什么想法吗?

+0

...为*看*更好的性能? – immibis

+0

是的,如果我有A0到A100我不能编码像上面 –

+4

你想要什么?更好的性能?更好的可读性?较短的代码? A0 ... A8如何使用? – assylias

回答

4

You've said你希望它“更短”。这里有一个较短的版本,除了我不知道你试图用A8,这是多余的A1做的,所以已经离开了这关:

private int[][] groups; // I assume you initialize `A0` and so on somewhere you haven't shown; initialize this there 

public Grouping() { 
    int i, groupIndex, group; 

    super(); 

    groupIndex = 0; 
    group = groups[0]; 
    for (i = 5; i < 80; ++i) { 
     if (i % 10 == 0) { 
      ++groupIndex; 
      group = groups[groupIndex]; 
     } 
     group[i] = i; 
    } 
} 

不过请注意,这仍然是相当怪异的代码,因为它完成了原始代码的功能,并将阵列中的各种条目保留其默认值(0)。例如,在您的代码中,A0的索引04从来没有被分配到,并且groups[0]04也是如此。 (而后续的有更大的差距。)

你的标题,虽然说,你希望它更“高性能”。 “performant”!=“short”你的代码可能是执行就好了,可能不知不觉地比我的好,因为它不需要循环内的%操作和if

还是这里的实施Seelenvirtuose's suggestion版本:

private int[][] groups; // I assume you initialize `A0` and so on somewhere you haven't shown; initialize this there 

public Grouping() { 
    int i; 

    super(); 

    for (i = 5; i < 80; ++i) { 
     groups[i/10][i] = i; 
    } 
} 

...这工作,因为i/10位整数除法。

+0

好点。另一个方面是维护(或可读性),对代码的更改可能更“高性能”。 – maraca

+0

这不是模块操作使得这段代码片段性能较差(如果有的话),而是'if'语句。这会导致分支预测有时会失败。一个简单的整数除法可能会更好:'int groupIndex = i/10; groups [groupIndex] [i] = i;'更重要的是:这将导致不必在循环外声明和初始化'group'和'groupIndex',使代码_look_更具可读性。 – Seelenvirtuose

+0

@Seelenvirtuose:这是一个有趣的想法。鉴于我的原始代码总是在执行一个'%',我猜这与'/'类似,这可能会更有效*并且*更少出错。 –

0

创建一个组类,它将持有年龄范围和一个计数器以保存该组的匹配。将组对象添加到列表并四处播放。

public static void main(String[] args) { 

    List<Group> lists = new ArrayList<Group>(10); 

    lists.add(new Group(5, 10)); 
    lists.add(new Group(10, 20)); 
    lists.add(new Group(20, 30)); 
    lists.add(new Group(30, 40)); 

    int age[] = { 5, 10, 20, 30, 11, 22, 33 }; 

    for (int i = 0; i < age.length; i++) 
     grouper: for (Group group : lists) 
      if (group.validateAgeGroup(age[i])) 
       break grouper; 

    for (Group group : lists) 
     System.out.println(group); 
} 

组类:年龄范围和计数器:

public class Group { 

    int startAge, endAge, counter; 

    public Group(int startAge, int endAge) { 
     this.startAge = startAge; 
     this.endAge = endAge; 
    } 

    public boolean validateAgeGroup(int age) { 
     if (age >= startAge && age < endAge) { 
      this.setCounter(1); 
      return true; 
     } 
     return false; 
    } 

    public int getCounter() { 
     return counter; 
    } 

    public int getEndAge() { 
     return endAge; 
    } 

    public int getStartAge() { 
     return startAge; 
    } 

    public void setCounter(int counter) { 
     this.counter += counter; 
    } 

    public void setEndAge(int endAge) { 
     this.endAge = endAge; 
    } 

    public void setStartAge(int startAge) { 
     this.startAge = startAge; 
    } 

    @Override 
    public String toString() { 
     return "Group [startAge=" + getStartAge() + ", endAge=" + getEndAge() 
       + ", counter=" + getCounter() + "]"; 
    } 
} 
0

我会用java8流。见我的例子代码:

import java.util.stream.Collectors; 
import java.util.stream.IntStream; 

public class Grouping { 
    public static void main(String[] args) { 

     // create a stream from 5 (inclusive) to 80 (exclusive) 
     IntStream.range(5, 80) 

     // convert it to Integer objects 
     .boxed() 

     // group it by tens 
     .collect(Collectors.groupingBy(i -> i/10)) 

     // iterate over each group 
     .entrySet().stream() 

     // pretty format 
     .map(entry -> "A"+entry.getKey()+"="+entry.getValue()) 

     // print to console 
     .forEach(System.out::println); 
    } 
} 

它输出:

A0=[5, 6, 7, 8, 9] 
A1=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 
A2=[20, 21, 22, 23, 24, 25, 26, 27, 28, 29] 
A3=[30, 31, 32, 33, 34, 35, 36, 37, 38, 39] 
A4=[40, 41, 42, 43, 44, 45, 46, 47, 48, 49] 
A5=[50, 51, 52, 53, 54, 55, 56, 57, 58, 59] 
A6=[60, 61, 62, 63, 64, 65, 66, 67, 68, 69] 
A7=[70, 71, 72, 73, 74, 75, 76, 77, 78, 79]