Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2008, 17:50   #1
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию Вопросы по оптимизации скорости

var
b:integer;
a:array [1..40 ] of integer;
1) b=10
2) a[1]=10;

var
a:integer;
c:record
a:integer;
end;
1) a=10;
2) c.a=10;
Будет ли 1) выполняться быстрее чем 2), если да, то на сколько?
Иллидан вне форума Ответить с цитированием
Старый 11.07.2008, 18:00   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Все приведенные варианты присвоения компилируются в

mov [xxx], 0Ah

cледовательно разницы не будет

Последний раз редактировалось alexBlack; 11.07.2008 в 18:07.
alexBlack вне форума Ответить с цитированием
Старый 11.07.2008, 18:01   #3
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Попробуй сам измерь.
Делай так
Код:
var
a:int64;
begin
a:=GetTickCount;
//тут действия
a:=GetTickCount-a;
Label.caption:=inttostr(a);
end;
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 11.07.2008, 18:17   #4
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Цитата:
Все приведенные варианты присвоения компилируются в

mov [xxx], 0Ah

cледовательно разницы не будет
Проверил. Получил разные результаты по времени для
1) a:=10;
2) c.a:=10; ?
Иллидан вне форума Ответить с цитированием
Старый 11.07.2008, 21:28   #5
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Кто-нибудь может объяснить почему так?
Иллидан вне форума Ответить с цитированием
Старый 11.07.2008, 21:28   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Иллидан Посмотреть сообщение
Проверил. Получил разные результаты по времени для
1) a:=10;
2) c.a:=10; ?
Скорее всего зависит от того, где объявлены переменные. Для глобальных переменных, как я уже говорил инструкции одинаковы (и время выполнения одинаково):

Код:
function RDTSC: integer;{int64} assembler;
asm
  db $0F,$31 // RDTSC
end;

type Tc = record
       a : integer;
     end;
var b:integer;
    c:TC;

procedure TForm1.Button1Click(Sender: TObject);
var T:integer;
begin
   T := RDTSC;
   b    := 10;  // mov [xxx], 0a
   T := RDTSC - T;
   showMessage(intToStr(T));  // 80

   T := RDTSC;
   c.a   :=10;  // mov [xxx], 0a
   T := RDTSC - T;
   showMessage(intToStr(T));  // 80
end;
Для локальных переменных обращение к струтурам и массивам - это:

mov edi, 0ah
mov [ebp-xxx], edi

обычные переменные компилятор может разместить в регистрах

например, mov esi, 0ah

(а может и в стеке и тогда будут точно такие же инструкции как для структур) Может отсюда и разница во времени выполнения. У меня, например, один компилятор дал одинаковое время, второй разное, но только для локальных переменных. Для глобальных переменных время всегда одинаковое.
alexBlack вне форума Ответить с цитированием
Старый 11.07.2008, 21:48   #7
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
без разницы! всё происходит с одинаковой скоростью будь переменная в классе, локальная переменная, глобальная, в другом юните. всё одинаково. за исключением случаев типа

Код:
    procedure SetXXX(const Value: integer);
    function GetXXX:integer;

    property XXX:integer read GetXXX write SetXXX;
в данном случае время обращения к свойству полностью зависит от функций GetXXX, SetXXX.
Так все-таки есть разница между скоростью обращения к глобальным
и локальным переменным?

Проверил код(a:=10 и c.a:=10) на старушке BP(с глобальными переменными) выдает разные результаты по скорости.
Иллидан вне форума Ответить с цитированием
Старый 11.07.2008, 22:04   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Иллидан Посмотреть сообщение
Так все-таки есть разница между скоростью обращения к глобальным
и локальным переменным?

Проверил код(a:=10 и c.a:=10) на старушке BP(с глобальными переменными) выдает разные результаты по скорости.
Разные компиляторы по-разному транслируют текст программы в коды процессора. В BP, насколько помню, тоже было окно CPU. Посмотрите какие команды ассемблера генерирует компилятор и смотрите время их выполнения в руководстве по процессору. То есть ответ "есть ли разница между скоростью обращения к глобальным и локальным переменным" зависит от используемого компилятора.

Да и зачем это нужно ? Разница, даже если она есть настолько незначительна, что это не даст выигрыша в скорости. Искать слабые места нужно в другом месте - длинные циклы, сложные вычисления...
alexBlack вне форума Ответить с цитированием
Старый 11.07.2008, 22:48   #9
Иллидан
Форумчанин
 
Регистрация: 16.01.2008
Сообщений: 288
По умолчанию

Цитата:
Разные компиляторы по-разному транслируют текст программы в коды процессора. В BP, насколько помню, тоже было окно CPU. Посмотрите какие команды ассемблера генерирует компилятор и смотрите время их выполнения в руководстве по процессору. То есть ответ "есть ли разница между скоростью обращения к глобальным и локальным переменным" зависит от используемого компилятора.
А если все таки взять компилятор Дельфы 7 что будет в нем?

Цитата:
Да и зачем это нужно ? Разница, даже если она есть настолько незначительна, что это не даст выигрыша в скорости. Искать слабые места нужно в другом месте - длинные циклы, сложные вычисления...
Ок, тогда такие вопросы если, не сложно: что работает быстрее goto или continue? Какой самый быстрый способ написать(нарисовать в т. с коорд. x,y) слово на форме, что-бы расстояние между буквами было равно заданному число?
Иллидан вне форума Ответить с цитированием
Старый 11.07.2008, 23:46   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Иллидан Посмотреть сообщение
А если все таки взять компилятор Дельфы 7 что будет в нем?
Если просто из любопытства, то сделать тестовый пример и посмотреть результаты. Пример я приводил.

Цитата:
Ок, тогда такие вопросы если, не сложно: что работает быстрее goto или continue?
Не думаю что есть какая-то разница. Еще раз. Метод получения ответов на такие вопросы очень прост. Открываем окно CPU, смотрим какой код генерирует компилятор на интересующую нас инструкцию и прикидываем время выполнения инструкций.

Цитата:
Какой самый быстрый способ написать(нарисовать в т. с коорд. x,y) слово на форме, что-бы расстояние между буквами было равно заданному число?
Код:
procedure TForm1.FormPaint(Sender: TObject);
begin
   Canvas.Font.size := 14;
   SetTextCharacterExtra(Canvas.Handle, 10 {заданное число});
   Canvas.TextOut(10, 10, 'String info');
end;
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение скорости компиляторов Umen Обсуждение статей 13 05.10.2009 19:48
Вопросы о оптимизации работы с СУБД Stilet БД в Delphi 8 21.07.2008 11:29
Помощь в оптимизации anger Общие вопросы Delphi 13 05.11.2007 13:15