2015-01-13 2 views
0

Я написал две функции для отображения чисел от 1 до 20 и скажу, которые являются кратными 3, кратным 5, которые являются обоим, а какие нет.Структурированный или неструктурированный алгоритм JavaScript

Я решил написать функцию, в которой используется как можно меньше времени.

Я получил эти две функции:

Первый:

function func1(){ 
console.time('execution time:'); 

for (var i=1 ; i<=20; i++) 
    if((i%5)===0 && (i%3)===0) 
     console.log("\n" + i + " : Multiple of 5 and 3."); 
    else{ 
     if(i%3===0) 
      console.log("\n" + i + " : Multiple of 3."); 
     else{ 
      if(i%5===0) 
     console.log("\n" + i + " : Multiple of 5."); 
      else 
       console.log("\n" + i); 
     } 
    } 
console.timeEnd('execution time:'); 

} 

Второй является:

function func2(){ 
    console.time('execution time:'); 

    for (var i=1 ; i<=20; i++){ 

     if((i%5)===0 && (i%3)===0){ 
      console.log("\n" + i + " : Multiple of 5 and 3."); 
      continue; 
     } 


     if(i%3===0){ 
      console.log("\n" + i + " : Multiple of 3."); 
      continue; 
     } 

     if(i%5===0) 
      console.log("\n" + i + " : Multiple of 5."); 
     else 
      console.log("\n" + i); 

    } 

    console.timeEnd('execution time:'); 
} 

func1() имеет время выполнения: 29ms

Функция func2() имеет время выполнения: 20 мс

Разница огромна около 1/3.

У меня 2 вопроса:

1) Является ли это лучше сравнить я% 5 === 0 до, а затем я% 3 === 0 или наоборот?

2) Функция func2() имеет время выполнения лучше, чем func1(), но func2() имеет неструктурированный код becouse У меня есть более чем одна точка выхода функции (ключевое слово continue считается go-to). Вопрос: Должен ли я хранить свой структурированный код и игнорировать время выполнения, или, если мне нужна хорошая производительность, могу ли я написать такой код?

+2

Это слишком мало времени для выполнения каких-либо вопросов. Наибольшее экономия времени будет заключаться в том, чтобы сохранить ваши результаты разделения (хотя время выполнения * может это сделать) вместо повторения «i% 5» и «i% 3» дважды. – Pointy

+1

Ваш браузер должен быть медленным, мой использует 1,655 миллисекунды, что составляет немногим более тысячи секунд, так что, иначе говоря, это не имеет значения, если вы не намереваетесь запустить функцию триллиона раз. – adeneo

+0

20 мс? На моем компьютере, который является старым и не очень быстрым, это 0 мс. Вы должны запускать его много раз, чтобы сравнить. – Oriol

ответ

0

Все комментарии верны. Здесь нет особых проблем с производительностью, чтобы беспокоиться об этом. Поэтому напишите код, который можно прочитать первым. Как насчет чего-то подобного? 0:

function func3() { 
    for (var i = 1; i <= 20; i++) { 
     var biz = (i % 3 === 0); 
     var buzz = (i % 5 === 0); 
     if (biz && buzz) { 
      console.log("\n" + i + " : Multiple of 5 and 3"); 
     } else if (biz) { 
      console.log("\n" + i + " : Multiple of 3"); 
     } else if (buzz) { 
      console.log("\n" + i + " : Multiple of 5"); 
     } else { 
      console.log("\n" + i); 
     }    
    } 
} 

В этом коде есть уже одна незначительная оптимизация. Поскольку я знаю, что есть более кратные 3, чем 5, я положил ветку biz впереди ветки buzz. Но я бы не стал заморачиваться над кодом с другими оптимизациями и использовать порядок с if (biz && ! buzz) ... if (buzz && ! biz) ... if (biz && buzz). Эта оптимизация (если это фактически фактически одна с дополнительными &&) будет сделана только позже, если я узнаю, что этот код является узким местом производительности.

+0

У меня есть ясное представление. Спасибо за ответ. – AntonioIT

Смежные вопросы