Pull to refresh

Comments 13

Теперь на 3ГГц на PHP :) это выполняется за 0.041секунды.
результаты других языков в студию!
Java. Выполняется за 76 микросекунд на Core i5 3.4 GHz

Код
int cnt = 10000;
int top = 262144;
long time = System.currentTimeMillis();
for (int i = 0; i < cnt; i++) {
	int delim = 1;
	for (int j = 1; j < top; j++)
		if (top % j == 0)
			delim = j;
}
time = System.currentTimeMillis() - time;
System.out.println("Average execution time: " + ((float) time / cnt) + " ms");

Average execution time: 0.0766 ms
А у вас оно точно что-то считало? Попробуйте результат каждой итерации сохранять куда-нибудь (например завести переменную, и на каждой итерации делать этой переменной += delim, и печатать «суммарное значение» в конце. А то похоже, что оно просто заоптимизировало цикл, т.к. результат вычисления все равно не используется.

Аналогичный код, но «сохранением результата», написанный на C, работает 1.4ms на Core 2 2.6GHz, а без печати результатов — 0.000ms. Как-то с трудом верится, что код на Java работает в 20 раз быстрее, не смотря на более мощный CPU.

P.S. Ваш код делает не совсем то, что делали авторы «малютки», там перебор шел в меньшую сторону. (Впрочем мой код — аналогично устроен, с которым я сравнивал, т.к. я допустил ту-же ошибку изначально).
Да-да, поправил ошибки и добавил туда использования переменной. Результаты изменились, Вы правы, оптимизация цикла имела место быть. Новый код отрабатывает за 387 микросекунд, в пять раз дольше.

Новый код
int cnt = 10000;
int top = 262144;
long time = System.currentTimeMillis();
int uselessVar = 0;
for (int i = 0; i < cnt; i++) {
    int delim = 1;
    for (int j = top - 1; j > 0; j--)
        if (top % j == 0) {
            delim = j;
            break;
        }
    uselessVar += delim;
}
time = System.currentTimeMillis() - time;
System.out.println("Value of useless var: " + uselessVar);
System.out.println("Average execution time: " + ((float) time / cnt) + " ms");

Value of useless var: 1310720000
Average execution time: 0.387 ms
Вот интересно, почему бы компилятору не выдавать предупреждение «а точно ли вам нужен этот бесполезный код?», ведь ситуация, когда можно так «заоптимизировать» вычисления явно попахивает ошибкой.
JS 0.000608s
Код
(function(){
    var startDate = +new Date(), i, cnt, result;
    for( cnt = 0; cnt < 1000; cnt++ )
        for( i = 262144; --i;)
            if( 262144 % i === 0 ){
                result = i;
                break;
            }
            
    console.log(result);
    console.log((+new Date() - startDate)/cnt);
})();

131072
0.597
SAS Base 0.0020 на Core i5 2.6 GHz
Код
data _null_;
format t 12.6;
t=time();
val=262146;
do i=val-1 to 1 by -1;
d=val/i;
if int(d) = d then
do;
t=time()-t;
put i= t=;
stop;
end;
end;
run;
С# Шел сверху вниз

const int top = 262144;
var start = DateTime.Now;
var answer = 0;
for (var i = 262143; i > 1; i--)
{
if (top%i != 0) continue;
answer = i;
break;
}
var time = DateTime.Now — start;
Console.WriteLine(«Average execution time: » + time + " Answer: " + answer);

«Average execution time: 00:00:00.0019992 Answer: 131072»
AMD FX 4100 Quad Core 4.62 Ghz

Сори, теги не работают.
Haskell, запускалось на ветеране Athlon XP 3000+

module Main where

top = 262144

main = putStrLn $ show $ findDelim top (top - 1)

findDelim num delim
  | (mod num delim) == 0 = delim 
  | otherwise = findDelim num (delim - 1)


Время выполнения замерялось утилитой time:
%time ./test2
131072
0.046u 0.005s 0:00.06 66.6% 987+5901k 0+0io 0pf+0w
Вот и я говорю — уж почти век прошел а нихрена нового в компах нет. Ну чуть быстрее считает, а толку то.
А вот память на электронно-лучевых трубках — это нечто. Спасибо за инфу, впечатлился.
А теперь, внимание! DVD-Ram, DVD-RW...BlueRay… итп :)
И на засыпку — плотность записи зависит от ширины пучка и предела до которого его можно сфокусировать. Уже тогда были зачатки технологии, которую сейчас(кроме flash итп) пытаемся вывести в лидирующие… О как.
Да, и заметьте, все это без движущихся частей!
благодаря ссылкам автора завис, как всегда, в вики на полтора часа, добрался до второй мировой и атомных бомб)
Sign up to leave a comment.

Articles