Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

int64 в цикле   Найти похожие ветки 

 
Ell ©   (2006-04-22 12:12) [0]

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

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?


 
MBo ©   (2006-04-22 12:15) [1]

Int64 нельзя делать счетчиком цикла.
Как оно у тебя вообще скомпилировалось?


 
Ell ©   (2006-04-22 12:33) [2]


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


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


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

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


 
MBo ©   (2006-04-22 12:41) [3]

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

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


 
Ell ©   (2006-04-22 12:55) [4]

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


 
MBo ©   (2006-04-22 12:57) [5]

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


 
palva ©   (2006-04-22 13:03) [6]

У меня 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 13:09) [7]

>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


 
Ell ©   (2006-04-22 13:17) [8]

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

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


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

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


 
begin...end ©   (2006-04-22 13:24) [10]

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

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


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

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

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


 
MBo ©   (2006-04-22 13:36) [12]

>лишь в том случае, если 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);


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

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


 
MBo ©   (2006-04-22 13:43) [14]

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

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


 
palva ©   (2006-04-22 13:48) [15]

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


 
Ell ©   (2006-04-22 13:49) [16]


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

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


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

MBo [9]:

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

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


 
MBo ©   (2006-04-22 14:02) [18]

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


 
MBo ©   (2006-04-22 14:05) [19]

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

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


 
Ell ©   (2006-04-22 14:48) [20]


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


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

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


 
Ell ©   (2006-04-22 14:58) [21]

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



Страницы: 1 вся ветка

Текущий архив: 2006.05.14;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.041 c
15-1145469529
Галинка
2006-04-19 21:58
2006.05.14
Delphi Personal Edition


2-1145606174
sergAP
2006-04-21 11:56
2006.05.14
Random


1-1144164074
Кашперук Иван
2006-04-04 19:21
2006.05.14
Как узнать текущий отображаемый контрол над контролом??


2-1145898986
Kolan
2006-04-24 21:16
2006.05.14
Как удалить контрол установленный с исп-ем библиотеки типов?


3-1142690910
Yastreb
2006-03-18 17:08
2006.05.14
Paradox. несколько картинок в одно поле