Форум: "Начинающим";
Текущий архив: 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