2014-12-17 6 views
0

Я пишу модуль, который будет генерировать DDL на основе определенных входных файлов. Я пытаюсь выяснить, какой путь более эффективен.Что является более эффективным способом написания этого блока кода

Это:

for (int i = 0; i < Common.testFields.size(); i++) { 
    line = ""; 
    line += " " + Common.testFields.get(i).toString() + " "; 
    line += Common.dataTypes.get(i).toString(); 
    if (i != Common.testFields.size() - 1) 
     line += ","; 
    ddl += line; 
    if (i != Common.testFields.size() - 1) 
     ddl += "\n"; 
} 

или это:

for (int i = 0; i < Common.testFields.size(); i++) { 
    line = ""; 
    line += " " + Common.testFields.get(i).toString() + " "; 
    if (i == Common.testFields.size() - 1) { 
     line += Common.dataTypes.get(i).toString(); 
     ddl += line; 
    } 
    else { 
     line += Common.dataTypes.get(i).toString() + ","; 
     ddl += line + "\n"; 
    } 
} 

я приурочил исполнение для обоих for петель с помощью System.currentTimeMillis(), но когда я распечатать истекшее время, он печатает 1 миллисекунду для обоих , Common.testFields.size() в настоящее время 165. Учитывая тот факт, что оба они имеют одинаковую сложность O(n), если Common.testFields.size() были значительно больше, скажем, в 1000 или даже 10000 раз больше, чем в настоящее время, какая из них, если таковая имеется, будет быстрее?

+3

Если вы действительно обеспокоены производительностью здесь, используйте StringBuffer –

+0

Кроме того, я не удивлюсь, если компилятор Java просто оптимизирует оба ваших фрагмента (примерно) одного и того же байтового кода Java –

+1

, и вы можете избежать последнего запись внутри цикла, перемещая код, выполняемый для последней записи вне цикла, и уменьшая количество итераций цикла на 1 –

ответ

4

Мой любимый "присоединиться" картина такова:

StringBuilder builder = new StringBuilder(); 
String separator = ""; 

for (int i = 0; i < Common.testFields.size(); i++) { 
    builder.append(separator) 
      .append(" ") 
      .append(Common.testFields.get(i)) 
      .append(" ") 
      .append(Common.dataTypes.get(i)); 

    separator = ",\n"; 
} 

String ddl = builder.append("\n").toString(); 

Нет особый случай "если в прошлом" или "если первый" необходимо.

1

Как об этом ...

//assuming 
String ddl = new String("") 

for (int i = 0; i < Common.testFields.size(); i++){ 
    ddl += " " 
     + Common.testFields.get(i).toString() 
     + " " 
     + Common.dataTypes.get(i).toString() 
     + ",\n"; 
} 

ddl = ddl.substring(0, ddl.length()-3); 
ddl += "/n"; 
+1

чистой и удобочитаемой.здесь есть две ошибки: 'ddl.substring (0, ddl.length() - 3);' должно быть 'ddl.substring (0, Math.max (0, ddl.length() - 2));' – BeyelerStudios

0

Если вы хотите быть уверены, что вам придется измерить.

// the JIT might be able to do this optimisation, but lets be sure 
StringBuilder builder = new StringBuilder(); 

// resolve this just once (assuming it stays the same during your loop), you never know how the VM is going to do this lookup 
// also change type of list to the type of Common.testFields 
ArrayList<? extends Object> fields = Common.testFields; 
ArrayList<? extends Object> data = Common.dataTypes; 
for (int i = 0, size = fields.size(); i < size; i++) { 
    builder.append(" ").append(fields.get(i)).append(" ").append(data.get(i)); 
    if (i != size - 1) 
     builder.append(",\n"); 
} 
ddl = builder.toString(); // or += or whatever the previous state of ddl is... 
Смежные вопросы