Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

int64 в цикле


Страницы:   1 2

Ell ©   (2006-04-22 12:12:00) 

Вот такая программка:

var
 Form1: TForm1;
 time: longword;
 i1_b, i2_b,i3_b,i4_b:byte;
 i1_w, i2_w,i3_w,i4_w:word;
 i1_lw, i2_lw,i3_lw,i4_lw:longword;
 i1_i64, i2_i64, i3_i64, i4_i64:int64;

...

procedure TForm1.FormShow(Sender: TObject);
begin

time:= GetTickCount;
for i1_b:=0 to 255 do for i2_b:=0 to 255 do for i3_b:=0 to 255 do
 for i4_b:=0 to 10 do;
Form1.Label1.caption:=IntToStr(GetTickCount-time);

time:= GetTickCount;
for i1_w:=0 to 255 do for i2_w:=0 to 255 do for i3_w:=0 to 255 do
 for i4_w:=0 to 10 do;
Form1.Label2.caption:=IntToStr(GetTickCount-time);

time:= GetTickCount;
for i1_lw:=0 to 255 do for i2_lw:=0 to 255 do for i3_lw:=0 to 255 do
 for i4_lw:=0 to 10 do;
Form1.Label3.caption:=IntToStr(GetTickCount-time);

time:= GetTickCount;
for i1_i64:=0 to 255 do for i2_i64:=0 to 255 do for i3_i64:=0 to 255 do
 for i4_i64:=0 to 10 do;
Form1.Label4.caption:=IntToStr(GetTickCount-time);


Почему в Label4 показывает 0?


Ell   (2006-04-22 14:58:00) [1]

Да ещё хочу спросить, пользуясь случаем (я не слишком наглею, отходя в оффтопик?)
Возможно ли в рамках 32-разрядной операционки использовать 64-разрядные команды для соответствующего прцессора (Атлон 64)?


Ell   (2006-04-22 14:48:00) [2]


> Оптимизация в свойствах проекта включена?


> Может, у тебя вообще в Билдере оптимизация была отключена.
> ..

Всё по умолчанию, ничего не менял - включена стал быть...


MBo   (2006-04-22 14:05:00) [3]

>упрощал до элементарного цикла (for)

В Сях for -  не совсем такой, как в Паскале. Это на самом деле наш while с возможностью кое-какой инициализации. И скорость его работы зависит от того, как оптимизатор разберется. Может, у тебя вообще в Билдере оптимизация была отключена...


MBo   (2006-04-22 14:02:00) [4]

Оптимизация в свойствах проекта включена?
Без нее у меня 750


Ell   (2006-04-22 14:00:00) [5]

MBo [9]:

> но скорее всего, здесь дело в незнании языка и неправильном
> применении конструкций.

Так я же говорю, что упрощал до элементарного цикла (for) - куда уж проще-то?


Ell   (2006-04-22 13:49:00) [6]


> У меня Athlon 3500+   -  выдает ~260 для любого из трех
> первых циклов

Да, интересно. Скорость даже не пропорционально выше...


palva   (2006-04-22 13:48:00) [7]

MBo ©   (22.04.06 13:36) [12]
Да, дела. Когда-то цикл for был нормальным, как у Вирта. Но потом появилось так много на первый взгляд странных оговорок... Лучше бы уж они решали проблемы оптимальности написанием нормального оптимизатора, как это сделано в си. Иначе это искривляет мозги разработчика.


MBo   (2006-04-22 13:43:00) [8]

>Ell ©   (22.04.06 13:40) [13]
>Athlon 64 2800+ (реальная частота 1800) выдаёт такие цифры: 953, 1000, 875, 0.

У меня Athlon 3500+   -  выдает ~260 для любого из трех первых циклов


Ell   (2006-04-22 13:40:00) [9]

Насчёт этой программки ещё вот что непонятно. У меняAthlon 64 2800+ (реальная частота 1800) выдаёт такие цифры: 953, 1000, 875, 0. Запускал на Celeron 2200, очень удивился, увидев там цифры меньшие - ведь я работал на том Селероне и замечал, что он гораздо тормознутее (например, сценку из 3d MAX рендерил 161 сек., в то время как мой - 35 сек.) Почему цикл-то быстрее проходит?


MBo   (2006-04-22 13:36:00) [10]

>лишь в том случае, если Int64-переменные объявлены как глобальные
Да, действительно, а я по привычке локальными сделал, а с глобальными компилируется с указанными хинтами и выбросом тела цикла.

>palva
>Может быть вы путаете с типом Comp
Нет, не путаю, но привык воспринимать Int64 как неполноценно поддерживаемый компилятором. Кстати, подобное поведение for относится и к Dword - здесь тело цикла тоже выбрасывается при превышении MaxInt:

var
 D, t: Cardinal;
begin
 t:=0;
 for D:=0 to 4000000000 do
   t:= D;
 Caption:=IntToStr(t);


palva   (2006-04-22 13:25:00) [11]

MBo ©   (22.04.06 13:09) [7]
В справке написано: Ordinal types include integer, character, Boolean, enumerated, and subrange types. А в перечислении целых типов имеется и тип int64.

Может быть вы путаете с типом Comp, он целый, но в то же время не порядковый? В старом паскале, когда не было int64, этот тип можно было использовать для работы с большими целыми.


begin...end   (2006-04-22 13:24:00) [12]

Ну, насчёт того, является ли Int64 порядковым типом или нет -- это спорный вопрос, ИМХО. Согласно справке, он относится к integer types, а последние относятся к порядковым типам. К тому же, к Int64 применима функция Ord, которая, правда, обрезает старшую часть числа.

Пример из [0] у меня компилируется, но лишь в том случае, если Int64-переменные объявлены как глобальные (собственно, в примере именно такой случай). При этом выдаются предупреждения "For loop control variable must be simple local variable" и хинты "FOR or WHILE loop executes zero times - deleted" (причём последние -- независимо от указанных границ цикла). Разумеется, тело цикла выбрасывается, и при работе программы он не крутится.


MBo   (2006-04-22 13:23:00) [13]

Возможно, что компилятор Builder в некоторых вещах хуже, чем дельфийский, а в некоторых лучше, но скорее всего, здесь дело в незнании языка и неправильном применении конструкций.
А вообще для C++ есть отличные компиляторы - хотя бы интеловский и MS-ный из Visual Studio. Оптимизация там выполняется лучше, чем в Дельфи (не во всех случаях, конечно выигрыш заметен, но часто он существенный)
Так что дело не в языке, а в компиляторе и в программисте ;)


Ell   (2006-04-22 13:17:00) [14]

Немного отвлекусь в другую сторону (тему уж не буду новую открывать), тоже всё хотел спросить у профессионалов - я сам программирую время от времени как любитель для себя...

Короче. Хотел одно время освоить C++, купил Builder 6, книжку, стал изучать... Но меня очень удивила скорость работы скомпилированной программы. Написал аналогичные программы на C++ и на Делфи, замерил программно время расчёта, и почему-то на С работало медленнее, и даже медленнее не в два, не в три раза, а на порядок! Стал постепенно упрощать программу, чтобы найти, где тормозит, упростил до элементарного цикла - и тот работает медленнее. С тех пор C++ забросил... Что его так и хвалят?..


MBo   (2006-04-22 13:09:00) [15]

>palva ©  
C Int64 Succ, Inc и т.п. работает, в хелпе особо отмечено, что они применимы к порядковым и к Int64, как в приведенном комментарии, а вот For у меня не желает, да и в справке (в т.ч. по D7) указано
Сounter is a local variable (declared in the block containing the for statement) of ordinal type,
без указания Int64


palva   (2006-04-22 13:03:00) [16]

У меня D7. Следующий код работает:
var
 iii: LongInt;
begin
 iii := 555;
 iii := Succ(iii);
// X is an expression of an ordinal type (including Int64). The result, of the same type as X, is the successor of X. (C) Help on Succ
 WriteLn(iii); // 556
end.


MBo   (2006-04-22 12:57:00) [17]

У меня 2006, но и в D6 это не должно было пройти


Ell   (2006-04-22 12:55:00) [18]

Странно, почему у меня-то компилируется? Может потому, что процессор Athlon 64? Но такого рода ошибки разве отслеживаются не на уровне компилятора? Да и этот процессор в 32 разрядном режиме вроде должен работать аналогично 32-разрядному... Или версии Делфи разные? У меня 7.


MBo   (2006-04-22 12:41:00) [19]

> Чем особенный этот тип?
Не является родным для 32-разрядных процессоров и - не порядковый тип (ordinal)

> у тебя что, не компилируется? Пробовал?
Ага. Да и заранее знал, что будет ошибка "For loop control variable must have ordinal type"


Ell   (2006-04-22 12:33:00) [20]


> Int64 нельзя делать счетчиком цикла.


Почему? Чем особенный этот тип?


> Как оно у тебя вообще скомпилировалось?

Легко. А у тебя что, не компилируется? Пробовал?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо