Решено: Кроссплатформеность проекта - как ее добиться?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение debi12345 » 27.11.2015 13:27:52

ИМХО, самое трудное в кросс-платформенности - печать с предпросмотром, причем такая чтобы все совпадало с точностью до долей миллиметра подо всеми ОСями. У меня дошло до маразма -а именно установки GSView32 (стоит 25баксов, но есть крэк) + Ghostscript для "Выни" как превьюера, в в Линуксе пришлось ставить M$ские TTF-шрифты и интегрировать их в Ghostscript, и использовать в обоих системах одинаковый "Fontmap" для этих шрифтов.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение SAK » 27.11.2015 15:09:17

Лекс Айрин писал(а):Используй для счетчиков цикла не Integer, а Byte -- я сомневаюсь, что цикл будет крутиться больше 250 раз.

Вот с этим утверждением позвольте не согласиться. Тип Integer действительно платформозависимый, но именно поэтому он оптимален для различных счётчиков, поскольку процессор обрабатывает числа с данной разрядностью максимально быстро.

azsx писал(а):я не хочу напрянать юзера showmessage ой
Напрягать не надо, надо говорить об ошибке другими способами: сделать неактивной кнопку продолжения и выделить неверный ввод красным цветом - не напрягает и сразу видно где ошибка.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение Лекс Айрин » 27.11.2015 16:00:55

SAK
Тут еще есть вопрос не скорости (все равно счетчик не дает особой потери производительности, да и, насколько мне известно, циклы крутятся преимущественно на регистрах процессора), но и вопрос переносимости. Указывая что используется Byte, Word, DWord мы всегда знаем максимальное число допустимое для переменной. И всегда можем понять где править если потребуется его увеличить, а в случае с integer могут быть плавающие ошибки возникающие у части программистов, но отсутствующие у других. Кстати, Integer в Lazarus/fpc определена ДВАЖДЫ, а это еще один источник проблем.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение SAK » 27.11.2015 16:43:16

Лекс Айрин писал(а):Тут еще есть вопрос не скорости (все равно счетчик не дает особой потери производительности, да и, насколько мне известно, циклы крутятся преимущественно на регистрах процессора).

И даже для работы с гегистрами оптамальнее переменные равные по разрядности регистру, иначе идёт потеря производительности, причём не всегда явная, она возникает при обработке конвейера в ядре процессора и для счетчика цикла это как раз может оказать существенное влияние на время работы всего цикла, особенно если счетчик цикла используется в качестве индекса обрабатываемого массива. По крайней мере для x86 процессоров, как обрабатываются числа в ARM не могу сказать. Что касается переносимости, то если для переменной достаточно 1 байта, то применение переменной большей разрядности проблем вызвать не может, если, конечно, при расчётах не используется переполнение.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение Лекс Айрин » 27.11.2015 17:27:32

SAK писал(а):И даже для работы с гегистрами оптамальнее переменные равные по разрядности регистру, иначе идёт потеря производительности, причём не всегда явная,


А вы не учитываете, что процессор не бюрократ -- он по возможности старается обработать(декодировать) инструкции до их фактического выполнения. Конечно, цикл сбрасывает эту очередь, но 1) не всегда 2) из-за этого возникают еще бОльшие потери производительности. Да и преобразование разрядности идет один раз, до выполнения цикла.

SAK писал(а):Что касается переносимости, то если для переменной достаточно 1 байта, то применение переменной большей разрядности проблем вызвать не может, если, конечно, при расчётах не используется переполнение.


А лично Вы всегда уверены, что в будущем, когда лично вы забудете текст программы, вам не придется столкнуться с тем, что переменную счетчик придется уменьшать, так как размер программы увеличится до безобразия? Или что из-за большого размера счетчика лично Ваша программа зависнет?

Конечно, в циклах это не так важно, лишь бы он прокрутился нужное количество раз, но ведь это уже стиль написания программы.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение SAK » 27.11.2015 20:11:29

Лекс Айрин писал(а):переменную счетчик придется уменьшать, так как размер программы увеличится до безобразия? Или что из-за большого размера счетчика лично Ваша программа зависнет?

:shock: Это как? Я не могу понять как размерность переменной может повлиять на размер программы. Также не могу представить какова может быть причина зависания программы если размер переменной больше чем требуется. Приведите пример пожалуйста :roll:
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение bormant » 28.11.2015 01:49:58

Зависания или нет, судить вам, но 2 миллиарда повторов вместо 32 тысяч -- легко:
Код: Выделить всё
for I:=0 to MaxInt do ...;
Код: Выделить всё
i:=0; while i>0 do begin ... Inc(i); end;
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение Лекс Айрин » 28.11.2015 10:35:49

SAK писал(а):Это как? Я не могу понять как размерность переменной может повлиять на размер программы.

Например, при определении типа (класса), даже какого то пресловутого массива. Плюс, даже неинициализированные переменные требуют места для хранения (если есть возможность, то они тупо заливаются всем сегментом в память), а если и не надо(сегмент неинициализированных данных не присутствует), то программа в памяти все равно создаст этот сегмент. И создаст, естественно по максимуму.

bormant, можно даже хуже (так как integer это переопределяемый тип)

Код: Выделить всё
type
Integer=Byte;
Var i:Integer;
Begin
...
i:= 3000;
...
end.

и все, глюк обеспечен. Или наоборот, сделать integer намного больше. Это в плане глюков даже поинтереснее может оказаться...
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение SAK » 09.12.2015 11:56:33

Лекс Айрин писал(а):Например, при определении типа (класса), даже какого то пресловутого массива. Плюс, даже неинициализированные переменные требуют места для хранения (если есть возможность, то они тупо заливаются всем сегментом в память)

А ещё есть такое понятие выравнивание данных https://ru.wikipedia.org/wiki/Выравнивание_данных и если это не отключить, то переменные Byte, Word и DWord будут место в памяти занимать одинаковое.

Лекс Айрин писал(а):и все, глюк обеспечен. Или наоборот, сделать integer намного больше.

Для полного счастья введите свои типы:
Код: Выделить всё
DWord=0..255;
WORD=0..$FFFFFFFF;
Byte=0..65535;

И программируйте в своё удовольствие.

Простой тестовый пример:
Код: Выделить всё
var s: array[0..65000] of word;
procedure TForm1.FormCreate(Sender: TObject);
var i,j: word;
    c: DWORD;
    k,l: integer;
begin
  c:=GetTickCount;
  for k:=0 to 65000 do
   for l:=0 to 65000 do s[l]:=s[l] xor k;
  c:=GetTickCount-c;
  Label2.Caption:=IntToStr(c);

  c:=GetTickCount;
  for j:=0 to 65000 do
   for i:=0 to 65000 do s[i]:=s[i] xor j;
  c:=GetTickCount-c;
  Label1.Caption:=IntToStr(c);
end;                   

Использование в качестве счетчика цикла переменной типа Word приводит к проигрышу производительности более 13%.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение SSerge » 09.12.2015 12:35:52

SAK писал(а):понятие выравнивание данных https://ru.wikipedia.org/wiki/Выравнивание_данных


Вот это вот делает весьма сомнительным способ сохранения например Record'ов или массивов операторами типа BlockWrite. Потому как 1) выравнивание всегда включено 2) Выравнивание у разных компиляторов (и разных версий) может быть разным и 3) Попробуй выключи! Все гуру в один голос вопят, что в этом случае ослушавшегося ждёт немедленная кара в виде тотальной деградации скорости исполнения. :D
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение Лекс Айрин » 09.12.2015 13:22:36

SAK писал(а):А ещё есть такое понятие выравнивание данных

Угу... а для чего оно надо? Для того чтобы при чтении данных из памяти в кеш переменная не попала на границу считываемого блока (если это произойдет, то придется считать 2 блока вместо одного) и, фактически, ни для чего больше. Компилятор, если он учитывает данный факт, сам должен разместить переменные правильным образом. Например, отсортировав по размеру. То есть, наличие/отсутствие возможности включить выравнивание данных очень многое говорит о производителе компилятора (особенно если это оптимизирующий компилятор).

SAK писал(а):Для полного счастья введите свои типы:


А зачем? Я, конечно, могу, и компилятор не заикнется, но возникшие, если что, глюки будут на МОЕЙ совести.

SAK писал(а):Использование в качестве счетчика цикла переменной типа Word приводит к проигрышу производительности более 13%.

Угу... лично у меня word делает integer, так что это от системы зависит и от процессора. Ну и никто не отменял проблем из-за разных режимов компиляции.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение SAK » 09.12.2015 17:09:26

SSerge писал(а):Вот это вот делает весьма сомнительным способ сохранения например Record'ов или массивов операторами типа BlockWrite.

На этот случай есть слово "packed".

Лекс Айрин писал(а):А зачем?

Так я тоже не знаю зачем, но Ваши же слова:
Лекс Айрин писал(а):bormant, можно даже хуже (так как integer это переопределяемый тип)
Код: Выделить всё
type Integer=Byte;
Var i:Integer;
Begin
    i:= 3000;
end.

и все, глюк обеспечен.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Решено: Кроссплатформеность проекта - как ее добиться?

Сообщение Лекс Айрин » 09.12.2015 17:18:11

SAK, зачем мне переопределять встроенный в язык тип? Это integer добавлен для совместимости, фактически, его могут и убрать

Добавлено спустя 4 минуты 51 секунду:
Word и Byte это часть компилятора и в самом языке она неизменна во всех его частях. Впрочем, как и в Лазаре.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru