Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.01 c
1-1144246078
d3777
2006-04-05 18:07
2006.05.14
Файл и динамический массив


15-1145264568
Некто
2006-04-17 13:02
2006.05.14
Виснет комп


2-1145693535
Ell
2006-04-22 12:12
2006.05.14
int64 в цикле


2-1142188972
Denver's
2006-03-12 21:42
2006.05.14
Cookies


2-1145794547
Melifaro
2006-04-23 16:15
2006.05.14
Заполнение динамического(открытого) массива (help plz)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский