OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 19 Апрель, 2024 10:13

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Отключение проверок
СообщениеДобавлено: Вторник, 12 Июнь, 2007 14:45 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Некоторые модули, скомпилированные с отключенными проверками ( DevCompiler.CompileOpt('!!') ) работают медленнее! :?: :?: :?:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 13 Июнь, 2007 00:31 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Надо смотреть конкретный случай... И еще возможны погрешности измерений. Особенно, если идет выделение памяти - тогда иногда инициируется сборка мусора, она сильно сбивает результат от замера к замеру...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 13 Июнь, 2007 09:53 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Вот конкретный пример -- модуль генерации случайных чисел.
Время выполнения -- 1.8 с, с отключенными проверками -- 3.9 c.

Код:
MODULE RandomNet; (* From Microsoft .NET Framework 2.0 *)

  VAR
    inext, inextp: INTEGER;
    SeedArray: ARRAY 56 OF INTEGER;

  PROCEDURE Random* (): REAL;
  VAR index, inextp1, num: INTEGER;
  BEGIN
    index := inext;
    inextp1 := inextp;
    INC(index);
    IF index >= 56 THEN index := 1 END;
    INC(inextp1);
    IF inextp1 >= 56 THEN inextp1 := 1 END;
    num := SeedArray[index] - SeedArray[inextp1];
    IF num < 0 THEN INC(num, 2147483647) END;
    SeedArray[index] := num;
    inext := index;
    inextp := inextp1;
    RETURN num * 4.6566128752457969E-10;
  END Random;

  PROCEDURE InitSeed* (seed: INTEGER);
  VAR num2, num3, i, j, k, index: INTEGER;
  BEGIN
    num2 := 161803398 - ABS(seed);
    SeedArray[55] := num2;
    num3 := 1;
    FOR i := 1 TO 54 DO
      index := (21 * i) MOD 55;
      SeedArray[index] := num3;
      num3 := num2 - num3;
      IF num3 < 0 THEN INC(num3, 2147483647) END;
      num2 := SeedArray[index]
    END;
    FOR j := 1 TO 4 DO
      FOR k := 1 TO 55 DO
        DEC(SeedArray[k], SeedArray[1 + ((k + 30) MOD 55)]);
        IF SeedArray[k] < 0 THEN INC(SeedArray[k], 2147483647) END
      END
    END;
    inext := 0;
    inextp := 21;
  END InitSeed;

BEGIN
  InitSeed(314159)
END RandomNet.


Код:
MODULE RandomTest;

  IMPORT Log, R := RandomNet, WinApi;

  CONST n = 3000;

  VAR M: ARRAY n, n OF REAL;

  PROCEDURE Sum (): REAL;
  VAR i, j: INTEGER; s: REAL;
  BEGIN
    FOR i := 0 TO n-1 DO
      FOR j := 0 TO n-1 DO
        M[i,j] := R.Random();
      END;
    END;
    s := 0;
    FOR i := 0 TO n-1 DO
      FOR j := 0 TO n-1 DO
        s := s + M[i,j];
      END;
    END;
    RETURN s;
  END Sum;

  PROCEDURE Do*;
  VAR tc1, tc2: INTEGER; r: REAL;
  BEGIN
    tc1 := WinApi.GetTickCount();
    r := Sum();
    tc2 := WinApi.GetTickCount();
    Log.Real(r); Log.Ln;
    Log.Int(tc2-tc1); Log.Ln;
  END Do;

END RandomTest.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 13 Июнь, 2007 18:16 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Извиняюсь за оффтопик. ИМХО, правильнее использовать платформенно независимые Services.Ticks() и Services.resolution для замера времени.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Среда, 13 Июнь, 2007 21:08 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Массив сделал 5000х5000 динамич. Вычисления в Sum обернул циклом - повторить 30 раз.

Пробовал: оба модуля компилировать (!!) и с обычными опциями. При компиляции без проверок идет потеря 3 команд (CMP, JA, "TRAP") на каждый индекс. Код без проверок выполнился быстрее. На 100 тиков. При таком-то объеме вычислений.

Потом я переделал n-1 на n во внешнем цикле (для первого индекса). Код поработал-поработал (нарушил структуру кучи скорее всего), потом вылезло illegal memory read, trap в HostFiles (при записи в Log) и BB помер.

Итого: рост производительности стремится к нулю (что вообще-то не новость). А надежность тю-тю... И как Вы думаете, почему у DevCompiler.CompileOpt документация отсутствует? :wink:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 00:02 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Евгений Темиргалеев писал(а):
Массив сделал 5000х5000 динамич. Вычисления в Sum обернул циклом - повторить 30
раз.

У меня массив сначала тоже был динамическим. Чтобы не было вопросов о влиянии сборщика мусора сделал его статическим.

Евгений Темиргалеев писал(а):
Код без проверок выполнился быстрее. На 100 тиков. При таком-то объеме вычислений.

Непонятно, почему у меня тогда он выполняется медленнее...

Евгений Темиргалеев писал(а):
Потом я переделал n-1 на n во внешнем цикле (для первого индекса). Код
поработал-поработал (нарушил структуру кучи скорее всего), потом вылезло illegal
memory read, trap в HostFiles (при записи в Log) и BB помер.

Ну и чего ещё можно ожидать при отключенных проверках и некорректном цикле?

Евгений Темиргалеев писал(а):
И как Вы думаете, почему у DevCompiler.CompileOpt
документация отсутствует?

А как вы думаете, почему DevCompiler.CompileOpt вообще присутствует в BlackBox? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 00:26 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Там есть другие опции, кроме отключения проверок. В частности - включение контроля переполнения элементарных типов. Или исключение символьной информации из объектника.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 08:08 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
PGR писал(а):
У меня массив сначала тоже был динамическим. Чтобы не было вопросов о влиянии сборщика мусора сделал его статическим.
Замер времени после создания массива и вопросов нет.
PGR писал(а):
Ну и чего ещё можно ожидать при отключенных проверках и некорректном цикле?
Ничего не ожидать и не отключать проверки :)
PGR писал(а):
А как вы думаете, почему DevCompiler.CompileOpt вообще присутствует в BlackBox? :)
Например, чтобы включить проверку на переполнение. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 08:13 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
PGR писал(а):
А как вы думаете, почему DevCompiler.CompileOpt вообще присутствует в BlackBox? :)

В Dev много чего присутствует. :) Однако что-то может быть необходимо разработчикам компилятора и среды, но противопоказанно к применению на практике.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 15:54 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
Попробовал на другом компьютере (Pentium 2, 366 MHz), с проверками и без проверок ~3.5 с. Ранее результаты приводились для Pentium 4, 2.8 Ghz. :? :? :?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 14 Июнь, 2007 16:02 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
PGR писал(а):
Попробовал на другом компьютере (Pentium 2, 366 MHz), с проверками и без проверок ~3.5 с. Ранее результаты приводились для Pentium 4, 2.8 Ghz. :? :? :?

Показательно. Это означает, что P4 работает хуже P2. :) Код же генерируется один и тот же - для i486. Возможно этот эффект связан с количеством команд попадающих на конвейер... хм...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB