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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2010, 11:41   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию Локальные переменные vs Глобальные

Пришла в голову вот какая мысль. Предполагаю, что она бредовейшая, но все-таки всегда лучше спросить. Правда?
Вот 2 варианта одного и того же
Вариант 1
Код:
procedure MyProc;
var
  i, j, k: Integer;
begin
  // тело
end;
Вариант 2
Код:
var
  i, j, k: Integer;
...
procedure MyProc;
begin
  // тело
end;
Будет ли программа со вторым вариантом реализации процедуры работать чуть-чуть быстрее, если MyProc использовать часто-часто-часто?
Sibedir вне форума Ответить с цитированием
Старый 30.12.2010, 11:44   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я бы сказал что скорость не уменьшится. Единственное что изменится так это добавится команда резервирования 3*4байт и команда очищения стека, но не более ибо оптимизатор бдить должен.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.12.2010, 11:56   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Будет ли программа со вторым вариантом реализации процедуры работать чуть-чуть быстрее
мне кажется - будет.. но именно "чуть-чуть".. да и то, зависит от того, как интенсивно дёргается сама процедура и эти переменные в ней...
NB. мнение чисто интуитивное, могу и ошибаться в любую сторону...

Цитата:
но не более ибо оптимизатор бдить должен.
я так понимаю, что в теле процедуры идёт работа с этими переменными...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.12.2010, 11:58   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Как по-моему, так программа с глобальными переменными чуть быстрее шевелится...
_-Re@l-_ вне форума Ответить с цитированием
Старый 30.12.2010, 11:59   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
я так понимаю, что в теле процедуры идёт работа с этими переменными...
Я тоже именно так и понял. И поскольку локальные переменки в стеке хранятся, для них будет выполняться команда смещения указателя стека.
Кстати - цикл for не любит работать с глобальными переменными, так что поаккуратнее с ним в паскале, та и Делфи тоже.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.12.2010, 12:07   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну да, ступил. У нас вчера корпоротив был
Это же проверить легко
Код:
const
  m1 = 10;
  m2 = 1000000;

var
  i2, j2, k2: Integer;

procedure MyProc1;
var
  i1, j1, k1: Integer;
begin
  i1 := 0;
  while i1 < m1 do begin
    j1 := 0;
    while j1 < m1 do begin
      k1 := 0;
      while k1 < m1 do begin
        k1 := k1 + 1;
      end;
      j1 := j1 + 1;
    end;
    i1 := i1 + 1;
  end;
end;

procedure MyProc2;
begin
  i2 := 0;
  while i2 < m1 do begin
    j2 := 0;
    while j2 < m1 do begin
      k2 := 0;
      while k2 < m1 do begin
        k2 := k2 + 1;
      end;
      j2 := j2 + 1;
    end;
    i2 := i2 + 1;
  end;
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i, b, e: Cardinal;
begin
  b := GetTickCount;
  for i := 1 to m2 do MyProc1;
  e := GetTickCount;
  ShowMessage (IntToStr (e-b));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i, b, e: Cardinal;
begin
  b := GetTickCount;
  for i := 1 to m2 do MyProc2;
  e := GetTickCount;
  ShowMessage (IntToStr (e-b));
end;
Вариант 2 работает дольше. И на много дольше.
Вопрос:
Почему? Это все из-за того, что локальные переменные в стеке, а к ним обращение быстрее идет (они в кэше)? А за глобальными переменными он в оперативку лазиет?

Последний раз редактировалось Sibedir; 30.12.2010 в 12:19.
Sibedir вне форума Ответить с цитированием
Старый 30.12.2010, 12:32   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
они в кэше
Впервые слышу чтоб стек кешировался. Стек это часть оперативной памяти, так что и за ними
Цитата:
он в оперативку лазиет
P.S. а-а-а Вот оно в чем дело. Как я и говорил оптимизатор бдит, но бдит он хитро. Локальные переменки твои он не в памяти хранит, а в регистрах процессора Проц проще говоря вообще в память не лезет. Кол-во переменок в процедуре 3 - этого хватит для набора регистров проца, как раз EDX,EBX,ECX для них и будет использоваться. Рискни вначале поставить директиву {$o-}
И увидишь что отключение оптимизатора уравнит шанцы
I'm learning to live...

Последний раз редактировалось Stilet; 30.12.2010 в 12:43.
Stilet вне форума Ответить с цитированием
Старый 30.12.2010, 12:46   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Код:
procedure MyProc1;
var
  ii1, jj1, kk1, ii2, jj2, kk2, ii3, jj3, kk3, i1, j1, k1: Integer;
begin
  ii1 := 0;
  jj1 := ii1 + 1;
  kk1 := jj1 - 1;
  ii2 := kk1 + 1;
  jj2 := ii2 - 1;
  kk2 := jj2 + 1;
  ii3 := kk2 - 1;
  jj3 := ii3 + 1;
  kk3 := jj3 - 1;

  i1 := kk3;
  while i1 < m1 do begin
    j1 := 0;
    while j1 < m1 do begin
      k1 := 0;
      while k1 < m1 do begin
        k1 := k1 + 1;
      end;
      j1 := j1 + 1;
    end;
    i1 := i1 + 1;
  end;
end;

procedure MyProc2;
begin
  i2 := 0;
  j2 := i2 + 1;
  k2 := j2 - 1;
  i2 := k2 + 1;
  j2 := i2 - 1;
  k2 := j2 + 1;
  i2 := k2 - 1;
  j2 := i2 + 1;
  k2 := j2 - 1;

  i2 := k2;
  while i2 < m1 do begin
    j2 := 0;
    while j2 < m1 do begin
      k2 := 0;
      while k2 < m1 do begin
        k2 := k2 + 1;
      end;
      j2 := j2 + 1;
    end;
    i2 := i2 + 1;
  end;
end;
Результат тот же. MyProc1 быстрее

Цитата:
Рискни вначале поставить директиву {$o-}
И увидишь что отключение оптимизатора уравнит шанцы
Гы. уровнял. Естественно в худшую сторону.

Последний раз редактировалось Sibedir; 30.12.2010 в 12:51.
Sibedir вне форума Ответить с цитированием
Старый 30.12.2010, 12:51   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот что я имею ввиду:

Код:
{$o-}
program Project1;

{$APPTYPE CONSOLE}

uses windows,
  SysUtils;
const
  m1 = 10;
  m2 = 1000000;
 {o-}
var
  i2, j2, k2: Integer;

procedure MyProc1;
var
  i1, j1, k1: Integer;
begin
  i1 := 0;
  while i1 < m1 do begin
    j1 := 0;
    while j1 < m1 do begin
      k1 := 0;
      while k1 < m1 do begin
        k1 := k1 + 1;
      end;
      j1 := j1 + 1;
    end;
    i1 := i1 + 1;
  end;
end;

procedure MyProc2;
begin
  i2 := 0;
  while i2 < m1 do begin
    j2 := 0;
    while j2 < m1 do begin
      k2 := 0;
      while k2 < m1 do begin
        k2 := k2 + 1;
      end;
      j2 := j2 + 1;
    end;
    i2 := i2 + 1;
  end;
end;
var
  i, b, e: Cardinal;

begin writeln('without Optomizer');
   b := GetTickCount;
  for i := 1 to m2 do MyProc1;
  e := GetTickCount;
  writeln ( (e-b));
  b := GetTickCount;
  for i := 1 to m2 do MyProc2;
  e := GetTickCount;
  writeln ( (e-b));
  readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Изображения
Тип файла: jpg Безымянный.JPG (9.6 Кб, 52 просмотров)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.12.2010, 12:57   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Да. Я понял про оптимизатор.
Я не понял почему с
Код:
var
  ii1, jj1, kk1, ii2, jj2, kk2, ii3, jj3, kk3, i1, j1, k1: Integer;
результат тот же. Ведь они явно в регистры не влазят. Или влазят?
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Локальные переменные Sibedir Общие вопросы Delphi 30 24.12.2010 04:42
глобальные переменные ZuBy Общие вопросы Delphi 3 11.09.2010 14:17
Глобальные и локальные переменные Kapitann JavaScript, Ajax 2 03.08.2010 14:24
Си++.Глобальные,локальные параметры. Медина Помощь студентам 0 02.06.2009 21:51
Локальные и глобальные переменные. Proger10 Общие вопросы Delphi 1 04.05.2009 05:55