Текущий архив: 2002.04.04;
Скачать: CL | DM;
Вниз
Сравнение компиляторов - часть 2 Найти похожие ветки
← →
Фэ © (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
Страницы: 1 2 3 вся ветка
Текущий архив: 2002.04.04;
Скачать: CL | DM;
Память: 0.65 MB
Время: 0.015 c