Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.01;
Скачать: CL | DM;

Вниз

Помяните меня в своих молитвах - в ближайшее время меня обрекли на Фортран =(   Найти похожие ветки 

 
Fellomena   (2002-02-13 15:53) [0]

Да, братья по ремеслу, так вот мучают нас, приверженцев Delphi... Меня один дядька-извращенец заставляет на каком-то вонючем DigitalFortran-е программить.
Ему видите ли нужен синтетический тест производительности компа. Я ему говорю - давай на Delphi или на старом-добром OP 7 сделаю - так он как заплевался, распух весь - ну думаю, сейчас "мАсТ дАй, SUXXX, ламо" и т.д. понесётся, уже приготовилась в глаз ему дать, но он попыхтел-поплевался и презрительно изверг фразу о том, что мол Фортран с плавающей точкой лучше работает, а про Delphi он что-то слышал... но не стоит.
Тест этот ему для обучения его тупых студентов нужен.
Я Фортран в глаза не видела - он меня за него посадил и говорит - пиши, а сам, паскуда, смотрит и ухмыляется.
Всё что я из себя и из Help-а выдавить за 40 минут успела (прошу прощения у модераторов за такую сквернь в форуме ;):

program FELLOMENA01

USE DFPORT
implicit none

real i, j, k, f
REAL(8) elapsed_time


i = 10E+6
j = 0
k = 0

print *, "Enter param:"

read(*, *) f


elapsed_time = TIMEF( )

Do While(k.Le.i)
!print *, j + (sqrt(abs(sin(i*j) + cos(i+j)))+f)
j = j + (sqrt(abs(sin(i*j) + cos(i+j)))+f)
k = k+1
EndDo

elapsed_time = TIMEF( )
PRINT " "
PRINT *, elapsed_time
PRINT *, j

end program FELLOMENA01

Бредятина та ещё...
И мужик сказал - что бы, говорит, массивов побольше было, память виртуальная грузилась и вообще общёт посложнее !!!
А я синтаксиса даже не знаю 8(
Кто мне что посоветовать может - краткий курс молодова извра по DigitalFortran может кто даст ?
Пишу и плачу...


 
Юрий Зотов (M) ©   (2002-02-13 16:21) [1]

> Фортран с плавающей точкой лучше работает,

Вот в этом он прав, между прочим. А синтаксис в Фортранах всегда был на уровне табуретки, что там учить-то? Да и литературы по ним в всех библиотеках всегда было полно.


 
MBo ©   (2002-02-13 16:39) [2]

зная Паскаль, на фортране не так уж и трудно писать. И про плавающую точку, видимо верно - бывает, что переведенная на Си или паскаль подпрограмма теряет точность - замечал на сложной матричной арифметике, где это критично


 
Виктор Щербаков ©   (2002-02-13 16:40) [3]

Года два назад переводил с какого-то диалекта Фортрана на Паскаль достаточно большую программу. Оказалось достаточно просто (если не учитывать плохой стиль источника, где на каждом шагу были GOTO).

Я думаю, и ты разберешься без проблем. Ведь Фортран не объектно-ориентированный, следовательно и абстракции в синтаксисе там меньше.


 
Виктор Щербаков ©   (2002-02-13 16:43) [4]

MBo ©

> бывает, что переведенная на Си или паскаль подпрограмма
> теряет точность


Интересно, Фортран с плавающей точкой в обход FPU работает?


 
MBo ©   (2002-02-13 17:21) [5]

загадка - но бывает.
может, компилятор (MSVF) 8087CW умно ставит


 
Sergo ©   (2002-02-13 17:28) [6]

Да, дядька твой действительно извращенец, но радуйся, что он не копнул поглубже насчет массивов, предел фортрана семимерные массивы,там точно рехнешся. Рад бы помочь,но нечем, мы все записи по фортрану лет 5 назад уничтожили :(.


 
VuDZ ©   (2002-02-13 18:09) [7]

2Виктор Щербаков - хорошо подмечено :)
если не хватает стандартной точности, используйте не 32х битные переменные (они хороши только для 3dnow & SSE) ака single (float), а 80 битные aka extended или как их там...

а вообще, лучше С или фортан но с интеловскими компиляторами, они действительно очень быстрый код генерят. вручную быстрее написать очень сложно


 
wicked ©   (2002-02-13 18:27) [8]

2 Fellomena
так я не понял, кто тупее - дядька или его студенты?.... он чё - вздумал их фортрану учить?... уж лучше сразу бейсику.... или лого... :)
может быть, решение проблемы - послать дядьку, а?....


 
Макс Черных ©   (2002-02-13 18:57) [9]

А мне вот тема ветки напомнила одну прикольную историю.
1987г. Москва, МВТУ им. Баумана (когда я там учился, оно так
называлось). Экзамен на кафедре П6 - выч. техника, естественно,
экзамен по фортрану (еще на ЕС 1047).
Один отличник (как звали, увы, забыл) пишет в проге:
...
A = 10
...


Переменная А у него при этом явно не обявлена. В остальном
программа была написана идеально. Так препод по фамилии Ваулин
выставил бедняге как вы думаете что? 2 балла.
Далее диалог:
- (С)За ЧТО?????
- (П)Как за что? Точка после 10 ГДЕ?
- (С)??
- (П)Фортран не строго типизированный язык, явно не объявленные переменные начинающиеся с I, J, K, L, M, N компилятор трактует как целые, а все остальные как REAL. Если написать А = 10.
то все OK, а если А = 10 (без точки) то при компиляции будет
добавлена процедура преобразования целого 10 в действительное 10.
- (С)Но ведь работать то будет.
- (П)Будет но не оптимально.
- (С)Но ведь процедура этого преобразования выполняется за
тысячную долю секунды.
- (П)А предположим, что эта строка в Вас выполняется в цикле
100000000 раз. Тогда потери времени составят около 2,7 часов.
Таким образом, при стоимости машиночаса 130руб., ущерб Родине
составит 350руб.! ОЦЕНКА - ДВА!

Студенты потом горько смеялись - Хитрый Шлоссер вырезал точку.
(Это в кино было "Вариант Омега", если кто не помнит)



 
evgeg ©   (2002-02-13 19:46) [10]

Фортран для численных расчетов лучший язык и по сей день.
Не один компилятор не может обогнать его в эффективности генерируемого кода. А всякие структуры в численных расчетах совсем и не нужны.


 
copyr25 ©   (2002-02-13 19:47) [11]

Помянем, помянем... Только, по моему скромному мнению,
ну, раз хоть один высоко-уровневый язык знаком - научиться писАть на др. - два, три дня:))
Я сам на Фортране so long, long time ago:)) делал чего-то... Ну, нормальный.
А Pascal лучше:)))


 
Fellomena   (2002-02-14 10:51) [12]

2 All: разобраться в Фортране не сложно, но мне просто противно ! вот !

2 Виктор Щербаков © (13.02.02 16:40): ты удивишься, но даже в Микрософтовском Visual Fortran-е в заготовках и примерах до сих пор имеются GO TO
И ты, imho, путаешь старый Фортран и тот, что раньше Digital назывался, а сейчас в постановку VisualStudio входит - с помощью него даже окошки создавать можно... корявые

2 VuDZ: aka extended - это в новом Фортране (скажу я тебе как новоявленный специалист ;) REAL(8) вроде называется :\

2 wicked: послать дядьку можно, но я же программистка, надо марку держать, а то итак о нас, Делфийцах, плохо отзываются...

2 All ещё раз: между прочим, новый Фортран (тот что визуальный) знаете что использовать может - MFC, да-да-да...

Ладненько, всем за поддержку спасибо...


 
Королев ©   (2002-02-14 11:35) [13]

я начинал с фортрана...очень страшно...очень глючно...
есть там много для работы с математикой, но это все тоже глючит...
фортран не нужен!!!


 
Юрий Зотов (M) ©   (2002-02-14 11:44) [14]

> Макс Черных

Да, в старых Фортранах так оно и было (хотя преподаватель, IMHO, все же перегнул палку - оценку можно было снизить, не не до двойки же). Но, думаю, современные компиляторы "поумнели" и подобные недостатки в них устранены.

По крайней мере, современные Фортран-компиляторы - оптимизирующие. Это уже о многом говорит.



> Виктор Щербаков © (13.02.02 16:43)

Фортраны, конечно, в обход FPU не работает. Просто их комипиляторы часто "затачивают" именно на оптимизацию вычислений, а потому они в ряде случаев могут строить программу не "в лоб" по исходнику, а с учетом особенностей машинной арифметики.


 
VuDZ ©   (2002-02-14 13:18) [15]

так же как и интеловские компиляторы - они иногда такое с кодом делают, что хоть стой, хоть падай. Да и процы то же извращаются как угодно - меняют поряд команд и прочеее :).
говорят, что Intel Fortran Compiler + прямые руки == гремучая смесь
хотя, когда нужны максимально быстрые расчёты - ассемблер спасёт отца русской демократии - только код нужно затачивать под определённый проц - iP2, iP3, K7. причём ещё иногда надо учитывать частоту системной шины, так как при этом можно выгодать до 10-15% прироста в скорости. Можно ещё добавить и SSE, но он только для 32х битных чисел. Обычно хватает, но не всегда.

2Fellomena учитывая, что у меня сейчас есть свободное время и пр., я бы предложил проверить какой компилер лучше - скажем небольшой расчёный алгоритм на фортране и С - что быстрее.
Просто я сам фортран не знаю, но было бы интересно выяснить этот вопрос :)
Как предложение?


 
VictorT   (2002-02-14 14:09) [16]

А моя начальница вот хочет, чтоб я на досовском FoxPro писал програму. Она видите ли, лет 20 назад на нём что-то ваять пыталась, и теперь считает что это самый крутой язык. А на моё робкое предложение писать на Дельфях или на Билде вообще выдала такое: "Ты уйдёшь, а кто програму сопровождать будет? FoxPro все знают, а твои Дельфи или Билдер никто не знает". Вот так вот.


 
Abajun ©   (2002-02-14 14:50) [17]

2Fellomena
Я вообще только и делаю, что пишу программы на смешанных языках: Fortran, Delphi и С++Builder. Самая лучшая информация по программированию на Фортран была получена из хелпа Compaq Visual Fortran Version 6.1 и еще немного из книг О.В. Бартьенева.
Но согласна - он противный.


 
Romkin ©   (2002-02-14 14:52) [18]

Думаю, сейчас на Интеловских процах уже все равно - объявил сопроцессорный тип (Double, REAL*8 и тд) - и считает уже сопроцессор, так что от языка мало зависит. Фортран хорош тем, что для него куча библиотек мат. расчетов. Да и работа с массивами удобная - историчекски можно в процедуру передать что-то вроде array of..., ,без размеров.
Что всегда нравилось в Фортране - встроенная поддержка комплексных чисел и арифметический оператор сравнения, плюс удобное задание блоков исходных данных.
Насчет учебников - рекомендую Пярнпуу "Программирование на Алголе и Фортране" - очень толковое древнее руководство, половина - Алгол, половина - Фортран IV. Сам когда-то учил, где-то дома валяется.
Собственно subj - фортран очень похож на Бейсик (точнее - наоборот :-))
Если не изменяет память - первые пять позиций в строке - для меток и если в первой позиции С, то вся строка - комментарий. Шестая позиция - если в ней любой символ, то это продолжение предыдущей строки (обычно ставят *). Собственно программа - с 7 по 80 позицию. Может быть, в этой версии все изменено, но вряд ли.
Есть типы чисел с плавающей точкой real и double precision, причем функции для real - sin, cos..., для double - dsin, dcos... для complex - csin, ccos. Для double в записи числа вместо E используется D.
И очень активно используются метки - в read/write, цикле DO (аналог for)


 
Fellomena   (2002-02-14 17:24) [19]

Ясн о мне отношение подавляющего числа людей к Фортрану... чтож... будем рвать 8E
А про Васик вспоминать не надо - до сих пор вспоминаю сцены из детства, как я за ZXSpectrum 48kb на этом Васике "программила", вспоминаю, как какое-то извращенство !

2 VuDZ: давай для начала попробуем метод пузырька для сортировки массива из 10E+4 элементов типа real. Массив предварительно создаём рандомайзом.

И ещё вопрос: вот в Фортране считается время, за которое выполняется код, стоящий между
elapsed_time = TIMEF( )
код
elapsed_time = TIMEF( )

В ObjectPascale есть нечто подобное ?
(я не о таймере говорю, а именно о Паскалевской ф-ии)


 
Фэ ©   (2002-02-14 18:08) [20]

А что, было бы интересно сравнить имеющийся инструментарий по вычислительной мощности.


 
VuDZ ©   (2002-02-14 18:10) [21]

GetTickCount() - winAPI +/- 10ms
тэкс... 10000 записей, всего ~80кило.
может пусть будет ~100"000 записей?

приступим-с :>


 
VictorT   (2002-02-14 18:19) [22]

>А про Васик вспоминать не надо - до сих пор вспоминаю сцены из детства, как я за ZXSpectrum 48kb на этом Васике "программила", вспоминаю, как какое-то извращенство !
Попрошу не обижать Спектрум. Я между прочим тоже на Спектруме програмил, и между прочим на асме вообще дивные вещи творил. И вспоминаю об этом, в отличие от тебя, с ностальгией.


 
Фэ ©   (2002-02-14 18:23) [23]

Блажен, кто может такое вспомнить.
Мне приходилось навигацинные системы на i8080(580) делать на asm,
включая такие вещи как весь мат.пакет по стат. обработке сигналов.


 
VuDZ ©   (2002-02-14 18:27) [24]

а... э... разве сортировка зависи от эффективной работы компилятора? тут всё зависит от алгоритма-с...
может что-ньть другое?


 
Фэ ©   (2002-02-14 18:29) [25]

Ok.
Обращение матрицы 500х500 заполненной rnd extended


 
Фэ ©   (2002-02-14 18:31) [26]

200 sec на P-iii 1000EB 256M


 
Фэ ©   (2002-02-14 18:31) [27]

Sorry, 20 sec


 
VuDZ ©   (2002-02-14 18:34) [28]

что значит обращение?
если делать тест то с мат. расчётами, а не на сравнение и пр.


 
Romkin ©   (2002-02-14 18:38) [29]

Обращение матрицы компактным методом Гаусса с выбором эл-та по столбцу :-))


 
VuDZ ©   (2002-02-14 18:38) [30]

нечто вроде такого:
double CCMFCDlg::FloatTest(int iInitVal)
{
m_spIUtility->TimerStart();
double f0 = 0;
double f1 = 123.456789;
double f2 = 98765.12345678998765432;
double f3 = 12345678943.98;
for(int i = 0; i < iInitVal; i++)
{
f0 = (f1 / (double)i) - f2 + (f3 * (double)i);
}
m_spIUtility->TimerEnd(/*sbsInfo*/);
CString ss;
ss.Format("Result is %f", f0);
MessageBox(ss);
return f0;
}


э... я хотел сказать:
function TForm1.FloatTest(iInitVal: Integer): double;
var
f0, f1, f2, f3 : double;
i : Integer;
begin
Utility1.TimerStart();
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;
Utility1.TimerEnd();
ShowMessage(Format("Result is %n", [f0]));
FloatTest := f0;
end;


 
iZEN   (2002-02-15 01:36) [31]

Для VuDZ.
Можно заодно и Java протестировать.

Вот что и как я тестировал в Java.

package test;
/**
* Title: Тестовые вычисления в Java
* Description: Небольшой float-тест
* Copyright: Copyright (c) 2002
* @author iZEN
* @version 1.0
*/
public class TestApplication {
/**
* Исходный код на ObjectPascal:
*
* FloatTest(iInitVal: Integer): double;
* var
* f0, f1, f2, f3 : double;
* i : Integer;
* begin
* Utility1.TimerStart();
* 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;
* Utility1.TimerEnd();
* ShowMessage(Format("Result is %n", [f0]));
* FloatTest := f0;
* end;
*
* Код на Java:
*/
public static double floatTest(int iInitVal) {
System.out.println("Float-тест с начальным значением=" + iInitVal);
double f0, f1, f2, f3;
int i;
long startTime, endTime, delay;
startTime = System.currentTimeMillis();
f0 = 0d;
f1 = 123.456789d;
f2 = 98765.12345678998765432d;
f3 = 12345678943.98d;
for(i = 1; i < iInitVal - 1; i++) {
f0 = (f1 / i) - f2 + (f3 * i);
}
endTime = System.currentTimeMillis();
delay = endTime - startTime;
System.out.println("Длительность Float-теста(миллисекунды): " + delay);
return f0;
}
/**Main method*/
public static void main(String[] args) {
int someValue = 1000000000;
double someResult = floatTest(someValue);
System.out.println("Float-тест закончен, результат=" + someResult);
}
}

/*
Железо: Duron 700МГц, 128МБайт SDRAM133.
Программное обеспечение: Borland JBuilder5.0 Enterprise с JRE/JDK1.3; JVM: java.vm.name="Java HotSpot(TM) Client VM"; java.vm.vendor="Sun Microsystems Inc."; java.vm.version="1.3.0_02".

Условия тестирования: компиляция без отладочной информации; запуск программы из IDE JBuilder.

Вывод в консоле JBuilder5.0 для нескольких запусков программы:

Float-тест с начальным значением=1000000000
Длительность Float-теста(миллисекунды): 26538
Float-тест закончен, результат=1.2345678919288543E19

Float-тест с начальным значением=1000000000
Длительность Float-теста(миллисекунды): 26548
Float-тест закончен, результат=1.2345678919288543E19

Float-тест с начальным значением=1000000000
Длительность Float-теста(миллисекунды): 26568
Float-тест закончен, результат=1.2345678919288543E19

Float-тест с начальным значением=1000000000
Длительность Float-теста(миллисекунды): 26518
Float-тест закончен, результат=1.2345678919288543E19

Float-тест с начальным значением=1000000000
Длительность Float-теста(миллисекунды): 26509
Float-тест закончен, результат=1.2345678919288543E19
*/

Статистики достаточно?
Может подкинете что-нибудь посложнее? Сравним.


 
VuDZ ©   (2002-02-15 02:54) [32]


#include "windows.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"

long double inline foo()
{
return (long double)pow((long double)rand() * long double(rand()), (long double)rand());
}

long double inline check(long double ld)
{
if (((int)ld % 3) == 0)
ld *= pow(ld, 2);
else
ld *= pow (ld, 0.5);

return ld;
}

int main()
{
DWORD dw1 = GetTickCount();
long double ld;
for (int i = 0; i < 0xfffff; i++)
ld += (check(check(check(foo()) * check((long double)i) * pow (long double(i), foo()) / foo()) * foo()));
DWORD dw2 = GetTickCount() - dw1;
printf("result - %Lg\n", ld);
printf("Time to calc - %i\n", dw2);
getch();
}


Intel - 2000ms
with out inline 2100ms
MS Compiler with inline - 4600ms
-//- -//- with out inline - 4500ms

Athlon 1000/133 on ASUS a7v266 512Mb DDR
мну-с... кто меньше?


 
Фэ ©   (2002-02-15 13:59) [33]

Ну что тут сказать..
MVC 6.0 дал 8.5 сек на P-III 1000EB 256M


 
Fellomena   (2002-02-15 14:13) [34]

Давайте быть последовательными и ставить конкретные задачи.

1). Сортировка одномерного массива размером 10E+4 типам real методом "Пузырька" снизу-вверх.
Тестить скорость надо на 1 машине, что бы получить одекватные результаты.
Все желающие - высылайте мне *.EXE модули, результатом работы которых будет файл, в котором будет содержаться
название языка, первое и последние значение полученного массива (и, если использовались, оптимизационные настройки компилятора).
Я буду на своей машине тестить и оглашать результаты здесь. Когда с первой задачей разберёмся приступим к чему-нибудь посерьёзнее.

Алгоритм по которому ориентироваться :)

program RANDOM2

USE DFPORT
implicit none

! Variables

integer i, j
real a(10E+4), k, temp
REAL(8) elapsed_time

! Body of RANDOM2

print *, "Waiting for array to be formated..."

DO j = 1, 10E+4
call RANDOM_NUMBER(k)
a(j) = k*100
!print *, a(j), j
end do

print *, "Testing CPU... Please wait..."

elapsed_time = TIMEF( )

DO i = 1, 10E+4
DO j = 1, 10E+4
if (a(i).LE.a(j)) then
temp = a(i)
a(i) = a(j)
a(j) = temp
endif
END DO
END DO

elapsed_time = TIMEF( )

print *, ""
print *, "Work complete ! Time = ", elapsed_time
print *, ""

!DO i = 1, 10E+4
!print *, a(i)
!ENDDO

read(*, *)
end program RANDOM2


 
Romkin ©   (2002-02-15 15:05) [35]

Отправил 15 кил - лови!


 
Fellomena   (2002-02-15 15:13) [36]

ok !!!

Следующий




 
VuDZ ©   (2002-02-15 18:07) [37]

ушло мылом...


 
Фэ ©   (2002-02-15 21:54) [38]

Тема действительно интересная.

Мне кажется, что стоит методически несколько по другому подойти.
Тема может растянуться надолго и, поскольку, Fellomena, взяла на себя труд тестировщика, а я бы сказал координатора, то для повыщения общности результатов предлагаю следующее.

1.На основе предложений Fellomena формирует очередной тест, приводя в псевдокоде (хоть бы и паскаль) алгоритм м давая ему имя TESTNAME.Тестровщики обязаны в точности его воспроизводить путем использования типовых языковых конструкций (не писать на асм в бейсике)

2.Для каждого теста полюбовно определяются:
- число циклов теста Cycle (напр 10 тыс);
- число циклов повторения теста Repeat (типовое 10);
Второй параметр обеспечит получение статистики от запуска
к запуску теста и позволит избежать "промахов" мультизадачности.

3.Каждый тестировщик обозначает свой псеводним <TESTER>.

4.Файл-ткст должен иметь структуру имени <exename>
TESTER_TESTNAME_CMP.EXE
TESTER - имя тестера;
TESTNAME - имя теста от Fellomena
CMP - наименование компилятора от Fellomena

5.На основе поступлений тестов Fellomena формирует список наименовани инструментария (Delphi 5.0 build 6.18 sp.1).
и краткое обозначение компилятора (Dx, MVC, BCx, JBx, ..)
Тестировщики обязаны им руководствоваться.
6.В результате работы теста должен формироваться текст файл <exename>.txt примерного содержания (на обсуждение).Его вместе с *.exe тестировщик высылает Fellomene.
7.Время измеряется в ms по GetTickCount.
8. При запуске теста д.б. минимизированы стронние процессы и задачи.

[Header]
Compiler=Delphi 5.0 build 6.18 sp.1
CPU=P-III 1000EB
RAM=256M
Chip=i815EP-B
Tester=Fe
Test=Bubble Sort
Cycle=10000
Repeat=10
[Time]
Time1=3380
Time2=2952
Time3=2975
Time4=2945
Time5=2960
Time6=2945
Time7=2955
Time8=2940
Time9=2955
Time10=2950

P.S. Думаю, что результаты всех заинтересуют.


 
Фэ ©   (2002-02-15 22:01) [39]

Отправил на почту


 
iZEN   (2002-02-15 23:51) [40]

Так Java будем тестить или как? Примеры кодов подходящие, я их могу легко адаптировать.

Гм...в Java нет такого понятия как exe-файл -- его заменяет JAR-Executable, который, например в Windows Explorer, по щелчку мыши загужается в виртуальную ява-машину, в памяти распаковывается и исполняется (можно запустить из bat-файла: java.exe -jar MyApplication.jar
и весь вывод на консоль производится как в обычном Win-приложении.



Страницы: 1 2 вся ветка

Текущий архив: 2002.04.01;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.018 c
3-3
andyfirst
2002-03-05 14:44
2002.04.01
Ошибка в запросе


3-75
SerKom
2002-03-07 18:20
2002.04.01
Почему для базы на IB (SQL Dialect 3) при использовании типа полей Date или Time


4-367
mishaa1
2002-01-31 01:21
2002.04.01
win api


1-100
Maybe
2002-03-20 15:58
2002.04.01
экземпляры различных классов в одной коллекции


1-238
AlexMey
2002-03-19 12:59
2002.04.01
Создание собственных классов?