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

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

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

Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

ИМХО, самое трудное в кросс-платформенности - печать с предпросмотром, причем такая чтобы все совпадало с точностью до долей миллиметра подо всеми ОСями. У меня дошло до маразма -а именно установки GSView32 (стоит 25баксов, но есть крэк) + Ghostscript для "Выни" как превьюера, в в Линуксе пришлось ставить M$ские TTF-шрифты и интегрировать их в Ghostscript, и использовать в обоих системах одинаковый "Fontmap" для этих шрифтов.
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

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

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

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

Сообщение Лекс Айрин »

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

Сообщение SAK »

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

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

Сообщение Лекс Айрин »

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


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

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


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

Конечно, в циклах это не так важно, лишь бы он прокрутился нужное количество раз, но ведь это уже стиль написания программы.
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

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

:shock: Это как? Я не могу понять как размерность переменной может повлиять на размер программы. Также не могу представить какова может быть причина зависания программы если размер переменной больше чем требуется. Приведите пример пожалуйста :roll:
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

Зависания или нет, судить вам, но 2 миллиарда повторов вместо 32 тысяч -- легко:

Код: Выделить всё

for I:=0 to MaxInt do ...;

Код: Выделить всё

i:=0; while i>0 do begin ... Inc(i); end;
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

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

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

Код: Выделить всё

type
Integer=Byte;
Var i:Integer;
Begin
...
i:= 3000;
...
end.

и все, глюк обеспечен. Или наоборот, сделать integer намного больше. Это в плане глюков даже поинтереснее может оказаться...
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

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

А ещё есть такое понятие выравнивание данных 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%.
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

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


Вот это вот делает весьма сомнительным способ сохранения например Record'ов или массивов операторами типа BlockWrite. Потому как 1) выравнивание всегда включено 2) Выравнивание у разных компиляторов (и разных версий) может быть разным и 3) Попробуй выключи! Все гуру в один голос вопят, что в этом случае ослушавшегося ждёт немедленная кара в виде тотальной деградации скорости исполнения. :D
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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

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

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


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

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

Угу... лично у меня word делает integer, так что это от системы зависит и от процессора. Ну и никто не отменял проблем из-за разных режимов компиляции.
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

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

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

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

Так я тоже не знаю зачем, но Ваши же слова:
Лекс Айрин писал(а):bormant, можно даже хуже (так как integer это переопределяемый тип)

Код: Выделить всё

 type Integer=Byte;
 Var i:Integer;
 Begin
    i:= 3000;
end.

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

Сообщение Лекс Айрин »

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

Добавлено спустя 4 минуты 51 секунду:
Word и Byte это часть компилятора и в самом языке она неизменна во всех его частях. Впрочем, как и в Лазаре.
Ответить