Форум: "Потрепаться";
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];
ВнизСравнение компиляторов - часть 2 Найти похожие ветки
← →
VuDZ (2002-02-18 04:05) [0]вот тут - http://vudz.by.ru/misc/flops.zip - есть исходник одного теста - вычисляет MFLOPS - если есть у кого желание - переводите на другие языки, сравним скорости...
Было бы интересно посмотреть Delphi 5 vs 6 :>
← →
Фэ (2002-02-18 09:25) [1]Link не работает
← →
Фэ (2002-02-18 09:58) [2]Что-то этуазизма не видно.
Видно батоны и лок кей интереснее обсуждать.
Тем не менее результаты будут выкладываться здесь
ftp.pi8plus.ru/pub/download/compare/
← →
savva (2002-02-18 10:04) [3]я тоже не смог скачать.. а глянуть было бы интересно... может каким другим образом можно скачать?
← →
Фэ (2002-02-18 10:45) [4]Вот этот не работает ?
ftp.pi8plus.ru/pub/download/compare/
А ты не только гляди, но и поучаствуй.
Первый алгоритм - "пузырьковая " сортировка.
Сам алгоритм и требования к выходному файлу
в каталоге см. выше.
Есть результат для D5, Free Pascal, BP7, Perl, Python.
Тестирование на разных машинах даст еще и статистику по hard
← →
savva (2002-02-18 11:34) [5]>Фэ © (18.02.02 10:45)
я хотел поучаствовать - проделать на С это (для сравнения :)))
не получается что то.. может дело в прокси, через который я выхожу..
← →
Фэ (2002-02-18 12:33) [6]to savva
Начни через ftp://ftp.pi8plus.ru
Выложил следующий алгоритм "Сортировка Шелла".
Так как работает быстрее, то увеличил размер массива до 100,000.
Free Pascal опять впереди D5.
← →
savva (2002-02-18 13:44) [7]>Фэ © (18.02.02 12:33)
не вышло.. наверное админ наш прикалывается :))
← →
VuDZ (2002-02-18 13:55) [8]у меня точно админ прикалывается - файл положил на сервер. а он не скачивается :( - вот это вроде работает <a> http://vudz.by.ru/files/flops.c</a>
← →
Фэ (2002-02-18 15:20) [9]Да, доступ есть.
Но, често говоря, я бы хотел в это мероприятие внести и некоторый обучающий элемент. Выдать на гора сложные тесты (их достаточно наваяно) не проблема. Получим мы какой-то интегральный ответ или нет - еще "бабушка надвое сказала".
Хотя примерный ответ мне известен.
А вот если двигаться по "восходящей", то можно увидеть тонкости в работе компиляторов(интерпретаторов).
Кроме того, это позволит начинающим "держаться" столько, сколько смогут.
Надеюсь, что сайт этот образовательные цели тоже преследует.
Для этого, на самом деле, надо не много:
- не воспринимать это как блажь (времени у всех не много);
- уметь работать в команде (четко руководствоваться договоренностями; не бросать сырость - кто-то должен за Вас ?; не ставить свое Ego на первое место);
- не бросать начатое дело (ответственность);
Договоримся ?
Выложил исходник для образца
ftp://ftp.pi8plus.ru/pub/download/compare/source.pas (dpr)
P.S.
Кто-то здесь упомянул о сетовании иноземцев на то, что пока мы (ино) добиваемся очередных микронов, они(мы с Вами) берут алгоритмами. Вот и давайте свое брать и учить и учиться.
← →
VuDZ (2002-02-18 20:21) [10]1. первые результаты весьма не однозначны: интеловкий компилятор, заточенный именно под мат. теты проиграл в некоторых местах старому доброму MS"овскому :<
Intel C++ Compiler -O3 -Og -G6
1 1.3358e-012 0.0193 727.2727
2 2.0517e-013 0.0174 402.8777
3 1.7542e-014 0.0224 759.7765
4 -5.4512e-014 0.0233 643.4316
5 3.3307e-016 0.0426 681.3510
6 -1.9040e-014 0.0424 683.8615
7 2.6034e-011 0.0524 228.9121
8 -5.4068e-014 0.0413 726.1725
CL -Og -G6
1 1.3429e-012 0.0250 559.3009
2 2.0517e-013 0.0175 399.6432
3 1.7542e-014 0.0239 710.1828
4 -5.4512e-014 0.0207 726.1725
5 3.3307e-016 0.0415 699.3218
6 -1.9040e-014 0.0350 827.4632
7 2.6034e-011 0.0562 213.6300
8 -5.4123e-014 0.0390 769.8476
results:
ICL
MFLOPS(1) = 475.9725
MFLOPS(2) = 422.6992
MFLOPS(3) = 599.2433
MFLOPS(4) = 703.2118
CL
MFLOPS(1) = 466.3024
MFLOPS(2) = 409.8934
MFLOPS(3) = 605.1030
MFLOPS(4) = 767.2243
тестовый файл тежит тут - <a href = http://vudz.by.ru/files/flops.c></a>...
2. результаты я не оформил как этого желали. в связи с разными причинами :>
3. пожелания:
все тесты делать консольными
перед началом теста ждать нажатия любой клавиши, что бы было можно выставить realtime приоритет
← →
VuDZ (2002-02-18 20:23) [11]и что странно, в второй графе даны ошибки... они несколько различны, даже для одного и того же компилятора. но с разными настройками оптимизации...
← →
Фэ (2002-02-19 13:16) [12]Выложил "Решето эратосфена" для D5 и Free Pascal
Нос в нос.
ftp://ftp.pi8plus.ru/pub/download/compare
← →
VuDZ (2002-02-19 13:24) [13]у меня было несколько другое решение, но похожее... но есть метод лучше и во много раз быстрее :)
я сейчас пытаюсть произвести reverse engenering своего же кода - с 3dNow перевести на С один очень мощный тест...
← →
Фэ (2002-02-19 13:31) [14]Я не выкладываю наиболее эффективные методы здесь - цель другая.
Они мне известны, но тема больших чисел должна освещаться отсторожно (это область крипто и декриптографии)
← →
VuDZ (2002-02-19 13:51) [15]ладно, так что у нас следующее по расписанию?
← →
Фэ (2002-02-19 13:59) [16]Сегодня подготовлю "Регресионный анализ"
(аппроксимация по МНК)
6-7 тестов в одном
(линейная, гипербол, показат,эксп, логарифм, парабол, полином)
← →
Фэ (2002-02-19 14:06) [17]Хотелось бы, чтобы кто-то еще присоединился. Я могу и С/Java/Fortran/Oberon параллельно делать, но давайте вместе.
Требования к выходному файлу не зря обозначены - смогу затем обработать их и выложить на сайт в разных разрезах.
← →
VuDZ (2002-02-19 14:16) [18]я могу помочь с С, перевести на него с Java & Pascal
← →
Фэ (2002-02-19 14:29) [19]Ну и давай - алгоритмы все там есть
ftp://ftp.pi8plus.ru/pub/download/compare
algorithm.txt для каждого случая.
sourse.pas - полный текст на паскале
← →
VuDZ (2002-02-19 14:44) [20]переделать source.pas который в корне?
← →
Фэ (2002-02-19 15:21) [21]Это для примера оформления под разные тесты.
Сами алгоритмы выложены в соотв. каталогах в файлах algorithm.text
← →
VuDZ (2002-02-19 16:44) [22]я у себя выложил новую версию решета - http://vudz.by.ru/files/minus.zip
кое-что я поменял, надо будет немного или переделать мои исходники или другие. Есть два exe - один с 10000 числел, другой с 300"000 - у меня комп быстрый, н я хотел бы увидеть результаты сегодня, а не через недулю :) Исходники прилогаются.
Есть 2 варианта - первый - решето, второй мой. Правда, я думаю его уже кто-то открыл до меня, но не важно.
На ftp залить не смог - ftpguest|123 не работает :(
Вот, есть одно предложение - написать класс для работы с длинными числами и на его основе вычислть просты числа по малой теореме Ферма с одим из каймалловых числел, 531 для примера.
Этим мы убъём друх зайцев - проверка как разные компиляторы работают на оптимизацию и как происходит работа с членами классов.
Как мысль?
← →
Фэ (2002-02-19 16:57) [23]Для того, чтобы сравнивать компиляторы а не алгоритмы, последние д.б. идентичны для разных платформ.
Вот и давай алгоритм.
← →
Фэ (2002-02-19 16:58) [24]вход ftpquest я убрал, если надо то по мылу скажу - мали у кого ума хватит биб-ку Мошкова мне залить.
← →
Фэ (2002-02-19 17:00) [25]Link твой не работает
← →
VuDZ (2002-02-19 17:04) [26]vudz.by.ru/files/minus.zip - вот так работает. ничего не поимаю.... походу дела, http:// не надо писать
алгоритм есть, осталось его превести в нормальный вид.
← →
VuDZ (2002-02-19 17:51) [27]vudz.by.ru/files/shell.zip - тут сортировка Шелла, два варианта - для long double 80bits & double 64bits.
Два exe - один с интеловским компилятором, другой - с MS compiler
исходники там же
← →
Фэ (2002-02-19 18:10) [28]Ok
← →
Фэ (2002-02-19 18:12) [29]Тормозной сервак у твоего п.
← →
VuDZ (2002-02-19 18:37) [30]раньше был очень быстрый... может просто потому, что я ночью работал?
← →
Fellomena (2002-02-20 10:43) [31]Ребята, при сортировке "Пузырьком" всех уделал Delphi6 - VFortran вообще не при делах:
****************************
Delphi6 Ent
Options: No debug info
Randomization array [1..100000] of real
Result:
First number 3.89129854738712E-0002
Last number 9.77562586776912E+0002
Time of sort: 430.041 sec
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
VFortran 6.1.0
Options: None
Randomization array [1..100000] of real
Result:
First number: 3.9208684E-05
Last number: 99.99982
Time of sort: 610.120000000000 sec
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
BorlandC++ 5.0
Options: None
Randomization array [1..100000] of real
Result:
First number: 2.4238182E-04
Last number: 89.79312
Time of sort: 501.230000000000 sec
*************************************
Вот такие пироги =)
← →
Фэ (2002-02-20 12:06) [32]Смотрите результаты здесь
ftp://ftp.pi8plus.ru/pub/download/compare/compare.htm
To VuDZ: полученое от тебя для Сей просто уснуло на P-III 1000EB.
Поэтому и не включил в таблицы.
Ты навалился всей мощью ООП и STL на бедные алгоритмы и их просто не стало видно за гигантской работой классов.
← →
Фэ (2002-02-20 12:10) [33]To Fellomena
Что-то очень низкие цифры в твоих тестах - на Cray тестила ?
← →
VuDZ (2002-02-20 12:42) [34]у меня всё умерло и без STL. STL на скорость не влияет - возможно у меня руки скривились...
2Fellomena
А почему ненту моего варианта, который я послал тебе?
← →
Fellomena (2002-02-20 13:03) [35]2 VuDZ:
ты мне не прислал исходник, а прога твоя массив размером 1E+4 обсчитывала, тогда как требование было 10E+4 - чувствуешь разницу ? ;)
real a[10000]обсчитывает за несколько секунд, тогда как 10E+4 за минуты - соответственно это даёт более точное представление о скорости и эффективности.
← →
Фэ (2002-02-20 13:15) [36]To Fellomena:
Я задал вопрос о цифрах и хотелось бы ответ услышать.
← →
Фэ (2002-02-20 13:18) [37]Сорри, не обратил внимание, что в сек, а не мсек.
Размер 100 тыс избыточен для точности.
← →
Fellomena (2002-02-20 13:25) [38]2 Фэ:
=)
Насчёт избыточности можно поспорить 8)
А комп:
Chaintech7AJA VIA KT-133
Duron 650 (+ небольшой разгон по шине)
Win98Se
Hyndai pc133 192Mb (+тюнинг интерливов и CASL)
← →
VuDZ (2002-02-20 13:45) [39]vudz.by.ru/files/shell.zip - еовый Шелл, без шаблонов
vudz.by.ru/files/math.zip - сортировка пузырьком для 100"000 элементов на IntelCC
PS мои глаза меня предали или проц умер, но интеловский компилер генерит более медленный код если нет вычислений. причём очень сильно медленный...
← →
Фэ (2002-02-20 14:18) [40]Обновление системного времени по GetTickCount (100 Гц или 10 ms).
Принимая равновероятный характер потока запросов, получаем среднее время ошибки измерения 5 мс.
При интервале 2000 мс имеем среднюю относительную ошибку 0.25%.
Т.е. с этим все в порядке.
Большую погрешность будет вносить мультизадачность, но она проявиться одинаково на любом значительном интервале.
Поэтому я и делал 10-кратное повторение циклов измерения, чтобы увидеть разброс и отсечь "промахи". В таблицах это видно.
Что имеем
Размер массива, тыс. Время [сек] СКО [мсек] отн.ошибка %
10 1.2 142 11
20 4.3 144 3
30 21 138 1
Т.о. при 30 тыс получаем среднеквадратическую ошибку измерения 1% что вполне достаточно для качественного сравнения компиляторов
← →
Фэ (2002-02-20 14:22) [41]Размер массива, тыс. Время [сек] СКО [мсек] отн.ошибка %
10_____________________1.2_________142_____________11
20_____________________4.3_________144______________3
30_____________________21 _________138______________1
← →
Фэ (2002-02-20 14:26) [42]To VuDZ
shell.zip старый или прокси лютует. CRC32= 7a309177
← →
VuDZ (2002-02-20 14:34) [43]давай я тебе всё на мыло сплавлю. оставь только адрес :)
PS для более точных измерений я предпочитаю использовать realtime приоритет, но: при длительной процедуре многозадачность нивелируется относительо малыми квантами времени перепадающими на долю стороних процессов находящихся практически в suspend mode
← →
Fellomena (2002-02-20 15:28) [44]Народ, только что попробовала запустить тот же Фортрановский тест, но предварительно повозившись пол часика с help-ом по настройкам. В итоге, выставив, по-моему мнению, наилучшие настройки для раввёртки цыклов, работы с массивами и плавающей запятой - получилось, что VF6.1.0 уделал (не намного - 130 msec) Delphi6 (в Delphi файле никаких дополнительных настроек не было).
Вот... 8\
← →
VuDZ (2002-02-20 15:32) [45]UNROLL вещь очень мощная для _коротких_ циклов
← →
Fellomena (2002-02-20 15:45) [46]2 цикла по 100000 итераций, притом один вложен в другой:
(10E+4)+(10E+4)=10E+8; => 1 миллиард итераций !
Это можно назвать коротким цыклом ?
Или имелись ввиду циклы, содержащие небольшое кол-во операций в своём теле ?
← →
VuDZ (2002-02-20 15:53) [47]имеется в виду короткий в машинных инструкциях код, когда задержки на выполнение jnz соизмеримы со временем исполнения цикла.
← →
Фэ (2002-02-20 15:57) [48]Включил тест от VuDZ для C и скомпилировал на MS Visual C 6.0.
Результат сам за себя..
ftp://ftp.pi8plus.ru/pub/download/compare/compare.htm
Fellomena посчитай для 10 тыс Bubble Test для VF и Builder и я включу в таблицы с поправкой на проц (у меня есть соотношение)
← →
Fellomena (2002-02-20 15:57) [49]В моей последней мессаге ошибка:
(10E+4) *(10E+4)=10E+8;
2 VuDZ: и в твоей тоже :)
j mp наверное :)
← →
VuDZ (2002-02-20 16:01) [50]jnz - Jump if Not Zero
я на асме пишу достаточно долго, что бы не ошибаться да и не пил я ещё :))
просто вариантов написания jmp ~ 40 штук, в зависимости от установленных флагов
← →
VuDZ (2002-02-20 16:06) [51]на счёт результатов - VC присутствует только в одном тесте :(
выкладывайте exe в одно место, посмотрим-с...
← →
Фэ (2002-02-20 16:15) [52]А разве во мне проблема ?
Пришли исходники по решету и шеллу - будут и другие цифры.
← →
VuDZ (2002-02-20 16:17) [53]извени за наивный ворос, в куда я их пошлю? они лежат у меня на сайте, адреса мыла ты не дал...
← →
Фэ (2002-02-20 16:21) [54]Шли на nesuda@freemail.ru
← →
VuDZ (2002-02-20 16:48) [55]1. shellsort у меня реализован крайне криво - похоже я ошибся в алгоритме :(
2. buble sort:
[Header]
Cycle=10000
Repeat=10
[Time]
Time1=1652
Time2=1643
Time3=1652
Time4=1643
Time5=1642
Time6=1642
Time7=1643
Time8=1642
Time9=1632
Time10=1633
MidTime = 1642,4
IntelC++:
Filling array...
Working with 10000.
Writting to file...
Time to calc - 952
MicrosoftC++
Filling array...
Working with 10000...
Writting to file...
Time to calc - 1262
вот-с...
← →
paul_shmakov (2002-02-20 16:58) [56]на злобу дня:
http://www.optim.ru/cs/2001/3/compar/compar.asp
не совсем согласен с процедурой проведения тестов, но все же кое-что в этом есть
← →
Фэ (2002-02-20 16:59) [57]Возможно. Шли исходники nesuda@freemail.ru
← →
VuDZ (2002-02-20 17:01) [58]уже выслал. для Эратосфена у тебя последнее число (в смысле до какого) ведуться расчёты?
← →
VuDZ (2002-02-20 17:03) [59]http://www.optim.ru/cs/2001/3/compar/compar.asp - это достаточно старый тест, на RSDN.ru лежит то же самое, но с коментариями относительно делфи
← →
VuDZ (2002-02-20 17:06) [60][Header]
Test=Eratosphen
Cycle=3000000
Repeat=10
[Time]
Time1=5698
Time2=5909
Time3=5798
Time4=5789
Time5=5678
Time6=5678
Time7=5688
Time8=5749
Time9=5738
Time10=5788
[Result]
Res0=216816
MidTime = 5751.3
но я не понял алгоритма :(
вот мой вариант:
for (register BYTE b = 0; b < times; b++){
dw1 = GetTickCount();
for (register unsigned int i = 2; i < nums; i++)
for (register unsigned int _i = i + 1; _i < nums; _i++)
{
if ((_i % i) == 0)
vec[_i] = 0;
}
for (i = 0; i < nums; i++)
if (vec[i] != 0)
{
res1[sz] = vec[i];
sz++;
}
dw2 = GetTickCount() - dw1;
time1 += dw2;
printf("%i - %i\n", i, dw2);
}
← →
Фэ (2002-02-20 17:13) [61]Да, читал.
← →
Фэ (2002-02-20 17:16) [62][Result]
Res0=216816
Это число найденных простых среди первых 3 млн ряда
← →
Фэ (2002-02-20 17:18) [63]В алгоритме не ставилась задача получить весь ряд простых, а всего лишь подсчитать кол-во найденных
← →
VuDZ (2002-02-20 17:23) [64]вот с этого и надо было начинать. я уже переделал
← →
VuDZ (2002-02-20 17:49) [65]господа, я должен признать что я осёл :(
больше не буду писать послк пьянки...
еле-еле понял алгоритм Фе :(
но вот результаты:
Working...
0 - 5638
1 - 5638
2 - 5638
3 - 5639
4 - 5648
5 - 5648
6 - 5628
7 - 5629
8 - 5638
9 - 5638
Time for complete - 56382
Total numbers - 216816
Time for an iteration - 5638.200084
Delphi5 MidTime = 5751.3
← →
VuDZ (2002-02-20 18:42) [66]и вот чего можно добиться, если изменить чуть-чуть программу, добавив один begin ... end блок:
Working...
0 - 1012
1 - 1001
2 - 1011
3 - 1012
4 - 1011
5 - 1012
6 - 1011
7 - 1012
8 - 1002
9 - 1011
Time for complete - 10095
Total numbers - 216816
Time for an iteration - 1009.500015
PS разброс в 10ms связан с тем, что на фоне играет музыка...
← →
iZEN (2002-02-20 18:43) [67]Итак, тест быстродействия Java2 (SunJRE/JDK1.4).
package test;
/**
* Title: Тестовые вычисления
* Description:
* Copyright: Copyright (c) 2002
* Company:
* @author iZEN
* @version 1.0
*/
import java.util.*;
import java.io.*;
public class TestApplication {
protected static void printProperties(PrintStream out, String[] keys) {
int i = 0;
try {
for (i = 0; i < keys.length; i++) out.println(keys[i] + "=" + "\"" + System.getProperty(keys[i]) + "\"" + ";");
} catch(SecurityException sex) {
out.println(keys[i] + ": нет доступа к свойству");
}
}
public static final String[] JVM_PROPERTY_NAMES = {"java.vm.name", "java.vm.vendor", "java.vm.version"};
public static void printJVMProperties(PrintStream out) {
printProperties(out, JVM_PROPERTY_NAMES);
}
public static void printAllProperties(PrintStream out) {
Vector keys = new Vector();
try {
Properties p = System.getProperties();
Enumeration e = p.propertyNames();
while(e.hasMoreElements())
try {
String key = new String((String)e.nextElement());
keys.add(key);
} catch (SecurityException nosex) {//Не обрабатывается
}
} catch (NoSuchElementException nonseex) {//Не обрабатывается
}
String[] allkeys = new String[keys.size()];
for(int i = 0; i < keys.size(); i++) allkeys[i] = (String)keys.elementAt(i);
printProperties(out, allkeys);
}
/**
* Исходный код на ObjectPascal:
*
* function FloatTest(iInitVal: Integer): double;
* var
* f0, f1, f2, f3 : double;
* i : Integer;
* begin
* f0 := 0;
* f1 := 123.456789;
* f2 := 98765.12345678998765432;
* f3 := 12345678943.98;
* for i := 1 To iInitVal - 1 do begin
* f0 := (f1 / i) - f2 + (f3 * i);
* end;
* result := f0;
* end;
*/
public static double floatTest(int iInitVal) {
double f0 = 0d;
double f1 = 123.456789d;
double f2 = 98765.12345678998765432d;
double f3 = 12345678943.98d;
for (int i = 1; i < iInitVal - 1; i++) {
f0 = (f1 / i) - f2 + (f3 * i);
}
return f0;
}
/**
* Генератор массива размером length со случайно распределённоыми значениями
* типа float
*/
public static float[] getRandomFloatArray(int length) {
float[] result = new float[length];
///Random r = new Random();
for(int i = 0; i < length; i++) result[i] = (float)Math.random() - 0.5f;///r.nextFloat();
return result;
}
/**
* Печать элементов массива
*/
public static void printFloatArray(PrintStream out, float[] arr, int from, int length) {
for(int i = from; i < from + length - 1; i++) out.print(arr[i] + ";");
out.println(arr[from + length - 1] + ".");
}
/**
* BubbleSort -- сортировка методом пузырька
*/
public static void bubbleSort(float[] data) {
float temp = 0;
for(int i = data.length; --i >= 0;) {
boolean swapped = false;
for(int j = 0; j < i; j++) {
if(data[j] > data[j+1]) {
temp = data[j];
data[j] = data[j+1];
data[j+1] = temp;
swapped = true;
}
}
if(!swapped) return;
}
}
/**Main method -- точка входа*/
public static void main(String[] args) {
long startTime, endTime, delay;
//System.out.println("System: ");
//printAllProperties(System.out);
System.out.println("JVM: ");
printJVMProperties(System.out);
System.out.println();
/* BubbleSort-тест -- cортировка методом пузырька */
int length = 100000;
float[] rfa = getRandomFloatArray(length);
System.out.println("BubbleSort-тест: cортировка методом пузырька " + length + " элементов типа float.");
System.out.print("До сортировки (часть данных): ");
printFloatArray(System.out, rfa, 9990, 10);
startTime = System.currentTimeMillis();
bubbleSort(rfa);
endTime = System.currentTimeMillis();
delay = endTime - startTime;
System.out.print("После сортировки (часть данных): ");
printFloatArray(System.out, rfa, 9990, 10);
System.out.println("Длительность BubleSort-теста (миллисекунды): " + delay);
System.out.println();
/* Float-тест */
int someValue = 1000000000;
System.out.println("Float-тест с начальным значением=" + someValue);
startTime = System.currentTimeMillis();
double someResult = floatTest(someValue);
endTime = System.currentTimeMillis();
delay = endTime - startTime;
System.out.println("Float-тест закончен, результат=" + someResult);
System.out.println("Длительность Float-теста (миллисекунды): " + delay);
System.out.println();
}
}
← →
iZEN (2002-02-20 18:46) [68]Реальные результаты.
Железо: Duron 700МГц, 128МБайт SDRAM133.
Программное обеспечение: Windows 2000 Professional RUS; Borland JBuilder6.0 Personal с Sun JRE/JDK1.4.0.
Условия тестирования: отладочная информация отключена, полная сборка (build all) перед каждым запуском.
Вывод на консоль (несколько запусков):
JVM:
java.vm.name="Java HotSpot(TM) Client VM";
java.vm.vendor="Sun Microsystems Inc.";
java.vm.version="1.4.0-b92";
BubbleSort-тест: cортировка методом пузырька 100000 элементов типа float.
До сортировки (часть данных): -0.20743817;0.42433405;-0.026971608;-0.3613428;0.23814881;-0.095044345;-0.2313191;-0.41837984;0.2855162;0.2153455.
После сортировки (часть данных): -0.40012056;-0.40011656;-0.40009293;-0.40007734;-0.40006626;-0.40005505;-0.4000522;-0.40004224;-0.40001923;-0.39999777.
Длительность BubleSort-теста (миллисекунды): 214559
Float-тест с начальным значением=1000000000
Float-тест закончен, результат=1.2345678919288543E19
Длительность Float-теста (миллисекунды): 26838
JVM:
java.vm.name="Java HotSpot(TM) Client VM";
java.vm.vendor="Sun Microsystems Inc.";
java.vm.version="1.4.0-b92";
BubbleSort-тест: cортировка методом пузырька 100000 элементов типа float.
До сортировки (часть данных): 0.39113837;-0.27484727;-0.4280536;0.37340558;-0.48770562;-0.31120205;0.07726008;0.16407555;-0.042036742;-0.45027137.
После сортировки (часть данных): -0.40100724;-0.40100354;-0.40097517;-0.4009507;-0.4009209;-0.40091097;-0.40089715;-0.40089545;-0.4008944;-0.40089306.
Длительность BubleSort-теста (миллисекунды): 212416
Float-тест с начальным значением=1000000000
Float-тест закончен, результат=1.2345678919288543E19
Длительность Float-теста (миллисекунды): 26869
JVM:
java.vm.name="Java HotSpot(TM) Client VM";
java.vm.vendor="Sun Microsystems Inc.";
java.vm.version="1.4.0-b92";
BubbleSort-тест: cортировка методом пузырька 100000 элементов типа float.
До сортировки (часть данных): -0.4443325;-0.25922766;0.4872929;-0.29503414;-0.28334635;-0.26456183;-0.20736563;0.3122543;0.43235898;-0.030510157.
После сортировки (часть данных): -0.4013865;-0.4013818;-0.4013561;-0.40134698;-0.40134087;-0.40131724;-0.4013105;-0.40127778;-0.40125465;-0.40124404.
Длительность BubleSort-теста (миллисекунды): 213287
Float-тест с начальным значением=1000000000
Float-тест закончен, результат=1.2345678919288543E19
Длительность Float-теста (миллисекунды): 26739
JVM:
java.vm.name="Java HotSpot(TM) Client VM";
java.vm.vendor="Sun Microsystems Inc.";
java.vm.version="1.4.0-b92";
BubbleSort-тест: cортировка методом пузырька 100000 элементов типа float.
До сортировки (часть данных): -0.31016558;-0.4022523;-0.4714901;-0.12545982;-0.17430124;0.04526925;-0.14471292;0.17425501;-0.4358193;0.11417931.
После сортировки (часть данных): -0.3982879;-0.39828393;-0.39828268;-0.3982797;-0.39826584;-0.39824674;-0.39822185;-0.39822096;-0.3982138;-0.3982054.
Длительность BubleSort-теста (миллисекунды): 211475
Float-тест с начальным значением=1000000000
Float-тест закончен, результат=1.2345678919288543E19
Длительность Float-теста (миллисекунды): 27299
JVM:
java.vm.name="Java HotSpot(TM) Client VM";
java.vm.vendor="Sun Microsystems Inc.";
java.vm.version="1.4.0-b92";
BubbleSort-тест: cортировка методом пузырька 100000 элементов типа float.
До сортировки (часть данных): 0.11877239;0.17907149;-0.19594985;0.36801875;0.007809818;-0.15974477;-0.4067;0.15205294;0.4026237;-0.44414395.
После сортировки (часть данных): -0.40063733;-0.40061754;-0.4006111;-0.40060538;-0.40060142;-0.40059537;-0.40058082;-0.4005679;-0.4005664;-0.40054452.
Длительность BubleSort-теста (миллисекунды): 213527
Float-тест с начальным значением=1000000000
Float-тест закончен, результат=1.2345678919288543E19
Длительность Float-теста (миллисекунды): 26628
← →
VuDZ (2002-02-20 19:18) [69]я думаю, нужно только версия транлятора/конпилятора + время + размер для наглядности
← →
VuDZ (2002-02-20 21:02) [70]PS я так и не понял: мы будем тесты проделывать на 64битными данными или 80битными с плавающей точкой? у меня используются именно такой тип данных. что сказывается на быстродействие из-за невыровненности данных в памяти
← →
Фэ (2002-02-21 00:27) [71]Надо делать так как уже начали - 64 бита (double) для сортировки;
и longint для Решета Э.
Потом можно сортировку повторить и для других типов.
Поскольку я изменил размер массива до 20 и 200 тыс для повышения точности измерений (см на сайте) просьба это учесть.
Раз мы уж взялись за это- будем последовательны.
Я уже говорил, что буду предлагать алгоритмы, имеющие вполне понятную полезность.
Завтра (сегодня уже) выложу тест на плавающую точку.
Тема - регрессионный анализ.
Информацию по тестам прошу сократить до необходимого минимума.
Hard, OS, Compiler, Average time [ms].
← →
VuDZ (2002-02-21 00:39) [72]в связи с делами, в ближайшие день-два врятли смогу принимать активное участие во всём, так что просьба: выложи файлик с описанием алгоритмов и точным указанием кол-ва элементов массива и повторов.
longint == 32 | 64bits ?
Я потом переделаю все исходники, так как был слегка не в кондиции последнии дни, результаты - потом
← →
Фэ (2002-02-21 00:52) [73]To iZEN
Поскольку Java это скрипт-машина, я ее занесу в таблицу с интерпретаторами. Для них размер массива 10 тыс double (64)
← →
Фэ (2002-02-21 00:59) [74]Delphi
Longint –2147483648..2147483647 signed 32-bit;
C
signed long;
← →
iZEN (2002-02-21 01:09) [75]/**Фэ © (21.02.02 00:52):
To iZEN
Поскольку Java это скрипт-машина, я ее занесу в таблицу с интерпретаторами. Для них размер массива 10 тыс double (64)
*/
Java -- это не скрипт-машина! Не путайте с JavaScript.
Java == JVM + JIT;
Я привёл тест пузырьковой сортировки со 100000( сто тысяч) float-элементов (=real), и он длился в среднем 212 секунд на Duron700. Аналогичный тест на Delphi ObjectPascal:
Fellomena (20.02.02 10:43)
Ребята, при сортировке "Пузырьком" всех уделал Delphi6 - VFortran вообще не при делах:
****************************
Delphi6 Ent
Options: No debug info
Randomization array [1..100000] of real
Result:
First number 3.89129854738712E-0002
Last number 9.77562586776912E+0002
Time of sort: 430.041 sec
<...>
Комментарии излишни -- цифры говорят за себя...:)
← →
iZEN (2002-02-21 01:12) [76]По поводу double: вечером, возможно, выложу результаты.
← →
iZEN (2002-02-21 01:45) [77]Оопс...
/**
Я привёл тест пузырьковой сортировки со 100000(сто тысяч) float-элементов (=real)
*/
Нужно исправить:
Java.float != ObjectPascal.real;
Java.float -- 4 байта;
ObjectPascal.real -- 8 байтов;
Так что ObjectPascal.real(8 байт) == Java.double(8 байт) -- если не ошибаюсь.
Доработаю тест.
← →
VuDZ (2002-02-21 02:33) [78]2Фе - просто int или long
← →
Фэ (2002-02-21 11:18) [79]Я уже писал, что такие большие объемы не обязательны.
Для пузырьковой сортировки для компиляторов выбран объем
20 тыс double (64 bit).При этом время одного цикла около 5 сек.
Для усреднения - 10 циклов
Время тоже у всех не резиновое.
>Java -- это не скрипт-машина! Не путайте с JavaScript.
Я не обратил сразу внимание, что о JIT идет речь.
Ок.Поместим на одну полочку.
← →
Фэ (2002-02-21 12:39) [80]Выложил регрессию и остальные обновил + исходники
ftp://ftp.pi8plus.ru/pub/download/compare/
ftp://ftp.pi8plus.ru/pub/download/compare/compare.htm
← →
Romkin (2002-02-21 14:17) [81]Мда, все отлично, но самое прикольное, что у меня нет доступа к ftp, только http. Нет ли доступа через этот протокол?
← →
Фэ (2002-02-21 15:08) [82]Чуть позже доофрмлю по человечески и выложу на сайт
Хотя лови.
http://www.pi8plus.ru/win/compare/compare.htm
← →
Romkin (2002-02-21 15:37) [83]Спасибо. Не хватает только, на каком компьютере считалось
← →
Фэ (2002-02-21 16:50) [84]Не спешите, все выложу.
P-III 1000EB,Epox i815EBP,256M, Win98SE
← →
VuDZ (2002-02-21 17:41) [85]вот, забыл сразу сказать: есть код, достаточно старый, который вывод нужную инфу о проце в файл. Я думаю, что портировать его под Делфи или Java будет не сложно, хотя с Java могут быть проблемы
class CCPUInfo
{
public:
CCPUInfo();
~CCPUInfo();
bool WriteTo(LPSTR szFName);
bool m_bReady;
private:
char *m_cCPUName;
DWORD m_dwCPUClock,
m_dwMemtotal,
m_dwAval;
__int64 GetCpuTick();
int GetCpuFrequency();
};
CCPUInfo::CCPUInfo()
{
m_cCPUName = new char[13];
m_bReady = false;
if (!m_cCPUName)
return;
m_bReady = true;
ZeroMemory(m_cCPUName, 13);
void * v = m_cCPUName;
_asm
{
xor eax, eax
cpuid
mov esi, v
mov [esi], ebx
mov [esi + 4], edx
mov [esi + 8], ecx
}
m_dwCPUClock = GetCpuFrequency();
MEMORYSTATUS memstat;
GlobalMemoryStatus(&memstat);
m_dwMemtotal = memstat.dwTotalPhys;
m_dwAval = memstat.dwAvailPhys;
}
CCPUInfo::~CCPUInfo()
{
if (m_bReady)
delete m_cCPUName;
}
__declspec(naked)
__int64 CCPUInfo::GetCpuTick()
{ __asm {
rdtsc
ret
} }
int CCPUInfo::GetCpuFrequency()
{
__int64 Frequency,
TimerCount1,
TimerCount2,
CpuCount1,
CpuCount2; if (!QueryPerformanceFrequency ((LARGE_INTEGER*) &Frequency)) return 0;
QueryPerformanceCounter ((LARGE_INTEGER*) &TimerCount1);
CpuCount1 = GetCpuTick ();
Sleep (500);
CpuCount2 = GetCpuTick ();
QueryPerformanceCounter ((LARGE_INTEGER*) &TimerCount2);
if (TimerCount1 == TimerCount2) return 0;
return (int) ((double) ((CpuCount2 - CpuCount1) * Frequency) /
(double) (TimerCount2 - TimerCount1));
}
bool CCPUInfo::WriteTo(LPSTR szFName)
{
if (szFName == NULL)
return false;
ofstream ofs((const char*)szFName);
if (ofs.is_open() == 0)
return false;
ofs << "CPU Vendor: " << m_cCPUName << endl;
ofs << "CPU Frequency: " << m_dwCPUClock / 1000000 << "\tin MHz" << endl;
ofs << "Total physical memory: " << (m_dwMemtotal / 1048576) << "\tin Mb"<< endl;
ofs << "Physical memory available: " << (m_dwAval / 1048576) << "\tin Mb" << endl;
ofs.flush();
ofs.close();
return true;
}
использование:
CCPUInfo ci;
ci.WriteTo("C:\\info.txt");
есть ещё вариант, который выводит инфу о проце - Атлон, пень и пр., о он очень большой. Можно добавить фишки на фкус, типа, имя тестер, дата, время...
C.U.
← →
Фэ (2002-02-21 18:18) [86]Все это есть, просто не хотелось засорять пока.
← →
VuDZ (2002-02-21 18:24) [87]э... что-то каталог regression пуст... или у меня проблемы со зрением-с...
← →
iZEN (2002-02-22 00:34) [88]Представляю тесты на сортировку массива методом пузырька для Delphi и Java.
Аппаратное обеспечение: AMD Duron 700МГц, 128МБайт SDRAM133.
Программное обеспечение: MS Windows 2000 Professional RUS; Borland Delphi 6.0 Enterprise; Borland JBuilder 6.0 Personal с Sun JRE/JDK1.4.0.
Условия тестирования: компиляция без отладочной информации; запуск программы из IDE.
Среда: Borland Delphi 6.0 Enterprise
Исходный код: Borland ObjectPascal
procedure BubbleSort (var a: array of Double);
var
I, J: Integer;
T: Double;
begin
for I := High(A) downto Low(A) do
for J := Low(A) to High(A) - 1 do
if A[J] > A[J + 1] then
begin
T := A[J];
A[J] := A[J + 1];
A[J + 1] := T;
end;
end;
Тип массива: заполненный элементами со значениями функции rand() на интервале (0;1.7e308)
Размер массива: 100000 элементов
Тип элемента массива: double (8 байт)
Среднее время сортировки (миллисекунды): 492338
← →
iZEN (2002-02-22 00:35) [89]Аппаратное обеспечение: AMD Duron 700МГц, 128МБайт SDRAM133.
Условия тестирования: компиляция без отладочной информации; запуск программы из IDE.
Среда: Borland JBuilder 6.0 Personal с Sun JRE/JDK1.4.0.
Свойства среды:
System:
os.arch="x86";os.name="Windows 2000";os.version="5.0";
sun.os.patch.level="Service Pack 2";sun.arch.data.model="32";
JVM:
java.vm.name="Java HotSpot(TM) Client VM";java.vm.vendor="Sun Microsystems Inc.";
java.vm.version="1.4.0-b92";java.runtime.name="Java(TM) 2 Runtime Environment, Standard Edition";
java.runtime.version="1.4.0-b92";
Исходный код: Java
public static void bubbleSort(double[] data) {
double temp = 0;
for(int i = data.length; --i >= 0;) {
boolean swapped = false;
for(int j = 0; j < i; j++) {
if(data[j] > data[j+1]) {
temp = data[j];
data[j] = data[j+1];
data[j+1] = temp;
swapped = true;
}
}
if(!swapped) return;
}
}
Тип массива: заполненный элементами со значениями функции rand() на интервале (0;1.7e308)
Размер массива: 100000 элементов
Тип элемента массива: double (8 байт)
Среднее время сортировки (миллисекунды): 314745
← →
iZEN (2002-02-22 00:36) [90]Аппаратное обеспечение: AMD Duron 700МГц, 128МБайт SDRAM133.
Условия тестирования: компиляция без отладочной информации; запуск программы из IDE.
Среда: Borland JBuilder 6.0 Personal с Sun JRE/JDK1.4.0.
Свойства среды:
System:
os.arch="x86";os.name="Windows 2000";os.version="5.0";
sun.os.patch.level="Service Pack 2";sun.arch.data.model="32";
JVM:
java.vm.name="Java HotSpot(TM) Client VM";java.vm.vendor="Sun Microsystems Inc.";
java.vm.version="1.4.0-b92";java.runtime.name="Java(TM) 2 Runtime Environment, Standard Edition";
java.runtime.version="1.4.0-b92";
Исходный код: Java
public static void bubbleSortStandart(double[] a) {
double t;
for(int i = a.length - 1; i >= 0; i--)
for(int j = 0; j < a.length - 1; j++)
if(a[j] > a[j + 1]) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
Тип массива: заполненный элементами со значениями функции rand() на интервале (0;1.7e308)
Размер массива: 100000 элементов
Тип элемента массива: double (8 байт)
Среднее время сортировки (миллисекунды): 503667
← →
iZEN (2002-02-22 00:38) [91]Так что оптимизация алгоритма много значит (сравните последние два теста Java).
← →
VuDZ (2002-02-22 00:54) [92]на счт оптимизации:
for i := 2 to N-1 do begin
if A[i] <> 0 then begininc(num); // count prime
j := i + i;
while j <= N-1 do begin
A[j] := 0;
j := j + i;
end;
end
end;
вот с такой элементарной вставкой скорость увеличиватся в 5 раз :>
← →
VuDZ (2002-02-22 02:19) [93]вот некоторые результаты, которые поразили мир (или по крайней мере меня :> )
BubbleSort:
10000 nums, 10 times
MS VC6.0 1181
C# 1220
IntelCCompiler 1062
Erratosphen:
300"000 nums, 10 times
MS VC6.0 984
MS C# 985
IntelCCompiler 1039
ну как всегда нафоне играет музыка, так что есть небольшой разброс.
но что странно, результаты для решета совпадали вплоть до последних 2х измерений один в один...
завтра попробую заняться тестми в плотную
C.U.
Страницы: 1 2 3 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.04.04;
Скачать: [xml.tar.bz2];
Память: 0.71 MB
Время: 0.006 c