2015-06-06 97 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]