2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Скорость выполнения
Сообщение20.04.2009, 16:05 


27/07/08
107
Russia
Меня интересует в модульном программировании на языке Fortran имеет разница как написан модуль:

Код:
MODULE name_module
...
CONTAINS

FUNCTION F1(X1)
END FUNCTION F1

FUNCTION F2(X2)
END FUNCTION F2

...

FUNCTION FN(XN)
END FUNCTION FN

END MODULE name_module


Если модуль написан с той лишь целью, чтобы посчитать функцию $FN(XN)$. Причем, функция $FN(XN)$, разумеется, использует предыдущие $N$ функций. Не будет ли эффективнее написать один большой модуль (после отладки), который бы выводил значения функции $FN(XN)$?
То есть, в модуле функции $F1, \, F2, \, ...$ вызываются лишь тогда, когда они действительно нужны, и значения их на каждом шаге по циклу не считаются?..

 Профиль  
                  
 
 
Сообщение22.04.2009, 08:51 


02/09/08
143
Если бы считались, то кто бы придумывал им аргументы?

 Профиль  
                  
 
 Re: Скорость выполнения
Сообщение22.04.2009, 12:29 


24/03/07
321
Ulrih писал(а):
То есть, в модуле функции $F1, \, F2, \, ...$ вызываются лишь тогда, когда они действительно нужны, и значения их на каждом шаге по циклу не считаются?..

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

 Профиль  
                  
 
 
Сообщение22.04.2009, 12:46 
Заслуженный участник


19/07/08
1266
Ulrih в сообщении #206448 писал(а):
Не будет ли эффективнее написать один большой модуль (после отладки), который бы выводил значения функции $FN(XN)$?
То есть, в модуле функции $F1, \, F2, \, ...$ вызываются лишь тогда, когда они действительно нужны, и значения их на каждом шаге по циклу не считаются?..

А можно поконкретнее? В целом, зависит от функций и прочее,
но! 1) в фортране все переменные передаются по ссылкам. Время на вызов функций пренебрежимо мало
2) если время выполнения функции сравнимо со временем вызова, умный компилятор сделает из неё inline. Поищите соответствующие ключики компилятора. В принципе, обычно ключиками компилятора можно оттюнинговать довольно заметно.

 Профиль  
                  
 
 
Сообщение22.04.2009, 13:04 
Заслуженный участник


11/05/08
32166
nestoklon в сообщении #206963 писал(а):
в фортране все переменные передаются по ссылкам.

Зависит от транслятора. Насколько я помню (впрочем, смутно), в IBM 360/370 длинные переменные передавались по ссылкам, но короткие (как минимум двубайтовые целые) -- по значению.

 Профиль  
                  
 
 
Сообщение22.04.2009, 15:09 
Заслуженный участник


19/07/08
1266
ewert в сообщении #206973 писал(а):
но короткие (как минимум двубайтовые целые) -- по значению.

Возможно. Мысль была в том, что в отличие например от C в котором можно убить всю производительность передачей массива через стэк, в фортране такое не проделаешь даже если постараться.

 Профиль  
                  
 
 
Сообщение22.04.2009, 15:36 


21/03/06
1545
Москва
nestoklon писал(а):
ewert в сообщении #206973 писал(а):
но короткие (как минимум двубайтовые целые) -- по значению.

Возможно. Мысль была в том, что в отличие например от C в котором можно убить всю производительность передачей массива через стэк, в фортране такое не проделаешь даже если постараться.

Как же Вы в Си собрались передавать массив через стэк?

 Профиль  
                  
 
 
Сообщение22.04.2009, 16:02 
Заслуженный участник


19/07/08
1266
e2e4 в сообщении #207025 писал(а):
Как же Вы в Си собрались передавать массив через стэк?

Код:
int do_something(double array[10000]) { ... }

Специально проверил. Работает.
Этот случай конечно клинический. Но случайно передать большой объект по значению в часто вызываемую функцию -- вполне распространённая ошибка насколько мне известно.

 Профиль  
                  
 
 
Сообщение22.04.2009, 16:20 


21/03/06
1545
Москва
То, что работает, несомненно. Однако, это вовсе не означает, что массив передается по значению. При вызове Вашей функции в Си передастся ссылка на массив, а не сам массив.

 Профиль  
                  
 
 
Сообщение22.04.2009, 16:24 
Заслуженный участник


11/05/08
32166
Вот чем Паскаль и хорош (я опять о своём, о девичьем) -- что там явно и принудительно устанавливаются передачи или по ссылке, или по значению.

 Профиль  
                  
 
 
Сообщение22.04.2009, 16:27 


21/03/06
1545
Москва
и уберите в квадратных скобках 10000, задавать размер массива в определении функции не имеет смысла (и, ИМХО, вводит в заблуждение) - ибо массив опять-таки передается по значению. Вы могли с тем же успехом написать:

Код:
int do_something(double array[]) { ... }

и даже так:

Код:
int do_something(double *array) { ... }


Добавлено спустя 2 минуты 38 секунд:

ewert писал(а):
Вот чем Паскаль и хорош (я опять о своём, о девичьем) -- что там явно и принудительно устанавливаются передачи или по ссылке, или по значению.

И опять с Вами соглашусь - учить все те случаи, когда Си передает параметры по значению, а когда по ссылке - напряжно.
И еще кстати напряжно учить 10+ приоритетов операций.
Но, к сожалению, мы вынуждены это использовать.

 Профиль  
                  
 
 
Сообщение22.04.2009, 17:19 
Заслуженный участник


19/07/08
1266
e2e4 в сообщении #207043 писал(а):
При вызове Вашей функции в Си передастся ссылка на массив, а не сам массив.

Возможно. Стоит поискать в учебниках. Но давайте напишем например так:
Код:
class array
{
public:
   double a[10000];
};
int do_smth(array ar){ ... }

Неужели тоже не через стэк по вашему пойдёт?

ewert в сообщении #207046 писал(а):
Вот чем Паскаль и хорош (я опять о своём, о девичьем) -- что там явно и принудительно устанавливаются передачи или по ссылке, или по значению.

В C тоже. Даже синтаксис очень похож.

e2e4 в сообщении #207047 писал(а):
и уберите в квадратных скобках 10000, задавать размер массива в определении функции не имеет смысла (и, ИМХО, вводит в заблуждение) - ибо массив опять-таки передается по значению.

Дык всё-таки ссылка или по значению?

 Профиль  
                  
 
 
Сообщение22.04.2009, 17:44 


21/03/06
1545
Москва
nestoklon писал(а):
e2e4 в сообщении #207043 писал(а):
При вызове Вашей функции в Си передастся ссылка на массив, а не сам массив.

Возможно. Стоит поискать в учебниках. Но давайте напишем например так:
Код:
class array
{
public:
   double a[10000];
};
int do_smth(array ar){ ... }

Неужели тоже не через стэк по вашему пойдёт?

ewert в сообщении #207046 писал(а):
Вот чем Паскаль и хорош (я опять о своём, о девичьем) -- что там явно и принудительно устанавливаются передачи или по ссылке, или по значению.

В C тоже. Даже синтаксис очень похож.

e2e4 в сообщении #207047 писал(а):
и уберите в квадратных скобках 10000, задавать размер массива в определении функции не имеет смысла (и, ИМХО, вводит в заблуждение) - ибо массив опять-таки передается по значению.

Дык всё-таки ссылка или по значению?


Все-таки ссылка. Однако, передачу объекта ищите сами - мне немного лениво. Возможно, объекты передаются по значению, сейчас не помню. Вы не поверите, но для программирования на Си/Си++ это имеет довольно малое значение (если конечно не злоупотреблять).

Речь изначально велась для Си. В Си массивы передаются по ссылке и никак иначе. Баста.

Добавлено спустя 1 минуту 44 секунды:

Я написал ренее - "массив передается по значению" - конечно, это глупость и опечатка. Массив в Си передается по ссылке.

 Профиль  
                  
 
 
Сообщение22.04.2009, 17:48 
Заслуженный участник


11/05/08
32166
e2e4 в сообщении #207082 писал(а):
Возможно, объекты передаются по значению, сейчас не помню.

Я в Сях (тем более плюсплюс) не разбираюсь, но это очень странно. Всё же объект -- гораздо более сложная структура, чем обычные данные, и как раз для него естественнее передача по ссылке.

 Профиль  
                  
 
 
Сообщение22.04.2009, 17:52 
Заслуженный участник


19/07/08
1266
e2e4 в сообщении #207082 писал(а):
Вы не поверите, но для программирования на Си/Си++ это имеет довольно малое значение (если конечно не злоупотреблять).

Да, я не поверю. Потому что один раз программисты в конторе в которой я на тот момент работал на этом пару десятков процентов "времени выполнения" прошляпили. Хотя возможно это подпадает под ваше "злоупотреблять". Они вообще довольно сильно злоупотребляли временами.

С массивами всё-таки ваша правда. Как в детстве научили "так никогда не делать", так я и не делал. :-)

Добавлено спустя 1 минуту 50 секунд:

ewert в сообщении #207086 писал(а):
и как раз для него естественнее передача по ссылке.

Дык потому и пишут все вместо
Код:
int some_code1(array a){...}

эквивалентное в 99% случаев
Код:
int some_code2(const array& a){ ... }

Но бывает забывают.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group