Адрес инструкции

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Адрес инструкции

Сообщение Azazaz » 13.03.2017 21:22:18

runewalsh Именно, пока доползет до последнего case можно кофе сварить. То ли дело добыть элемент массива и сделать один прыжек.
Так вот, я попытался заполнить массив смещений:
Код: Выделить всё
{$mode objfpc}{$H+}
{$inline on}
{$GoTo ON}

type
TOffs = LongWord;
{Jump, P1, P2, End}

var
O: TOffs;
label
Beg, L1, L2, Pass;
procedure FillOffset;
begin
O:= Byte(@L1 - @Beg);
end;

procedure Proc;
procedure S1;inline;
begin Writeln('S1'); end;
procedure S2;inline;
begin Writeln('S2'); end;
begin
Beg: {asm jmp }
L1: S1;
L2: S2;
Pass:
end;
begin

end.

и получил:
Error: Taking the address of labels defined outside the current scope isn't allowed
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: Адрес инструкции

Сообщение zub » 13.03.2017 21:26:48

На багтрекер?
Я для подобного использую TMap скорость не мерил - таких больших кейсов не имею

Добавлено спустя 2 часа 5 минут 11 секунд:
сделал тест на основе циферок от runewalsh. Время заполнения мапы конечно идеально - ключики идут в возрастающем порядке. Но это только время заполнения - на сам тест оно не влияет
Код: Выделить всё
program case2map;
uses
  gmap,gutil,sysutils;
type
  TMyKey=Integer;
  TMyOnKeyProc=procedure(key:integer);
  TMyKeyComparer=specialize TLess<TMyKey>;
  TMyCase2Map=class(specialize TMap<TMyKey,TMyOnKeyProc,TMyKeyComparer>)
    procedure doit(key:TMyKey);
  end;
var
  MyCase:TMyCase2Map;
  myTime:TDateTime;
  ts:string;
  i,j:integer;

procedure test(key:integer);
begin
  randseed:=key;
end;

procedure TMyCase2Map.doit(key:TMyKey);
var
  proc:TMyOnKeyProc;
begin
  if TryGetValue(key,proc) then
    proc(key)
end;

begin
  MyCase:=TMyCase2Map.Create;

  myTime:=now;
  MyCase.Insert(0,@test);
  MyCase.Insert(1,@test);
  MyCase.Insert(4,@test);
  MyCase.Insert(9,@test);
  MyCase.Insert(16,@test);
  MyCase.Insert(25,@test);
  MyCase.Insert(36,@test);
  MyCase.Insert(49,@test);
  MyCase.Insert(64,@test);
  MyCase.Insert(81,@test);
  MyCase.Insert(100,@test);
  MyCase.Insert(121,@test);
  MyCase.Insert(144,@test);
  MyCase.Insert(169,@test);
  MyCase.Insert(196,@test);
  MyCase.Insert(225,@test);
  MyCase.Insert(256,@test);
  MyCase.Insert(289,@test);
  MyCase.Insert(324,@test);
  MyCase.Insert(361,@test);
  MyCase.Insert(400,@test);
  MyCase.Insert(441,@test);
  MyCase.Insert(484,@test);
  MyCase.Insert(529,@test);
  MyCase.Insert(576,@test);
  MyCase.Insert(625,@test);
  MyCase.Insert(676,@test);
  MyCase.Insert(729,@test);
  MyCase.Insert(784,@test);
  MyCase.Insert(841,@test);
  MyCase.Insert(900,@test);
  MyCase.Insert(961,@test);
  MyCase.Insert(1024,@test);
  MyCase.Insert(1089,@test);
  MyCase.Insert(1156,@test);
  MyCase.Insert(1225,@test);
  MyCase.Insert(1296,@test);
  MyCase.Insert(1369,@test);
  MyCase.Insert(1444,@test);
  MyCase.Insert(1521,@test);
  MyCase.Insert(1600,@test);
  MyCase.Insert(1681,@test);
  MyCase.Insert(1764,@test);
  MyCase.Insert(1849,@test);
  MyCase.Insert(1936,@test);
  MyCase.Insert(2025,@test);
  MyCase.Insert(2116,@test);
  MyCase.Insert(2209,@test);
  MyCase.Insert(2304,@test);
  MyCase.Insert(2401,@test);
  MyCase.Insert(2500,@test);
  MyCase.Insert(2601,@test);
  MyCase.Insert(2704,@test);
  MyCase.Insert(2809,@test);
  MyCase.Insert(2916,@test);
  MyCase.Insert(3025,@test);
  MyCase.Insert(3136,@test);
  MyCase.Insert(3249,@test);
  MyCase.Insert(3364,@test);
  MyCase.Insert(3481,@test);
  MyCase.Insert(3600,@test);
  MyCase.Insert(3721,@test);
  MyCase.Insert(3844,@test);
  MyCase.Insert(3969,@test);
  MyCase.Insert(4096,@test);
  MyCase.Insert(4225,@test);
  MyCase.Insert(4356,@test);
  MyCase.Insert(4489,@test);
  MyCase.Insert(4624,@test);
  MyCase.Insert(4761,@test);
  MyCase.Insert(4900,@test);
  MyCase.Insert(5041,@test);
  MyCase.Insert(5184,@test);
  MyCase.Insert(5329,@test);
  MyCase.Insert(5476,@test);
  MyCase.Insert(5625,@test);
  MyCase.Insert(5776,@test);
  MyCase.Insert(5929,@test);
  MyCase.Insert(6084,@test);
  MyCase.Insert(6241,@test);
  MyCase.Insert(6400,@test);
  MyCase.Insert(6561,@test);
  MyCase.Insert(6724,@test);
  MyCase.Insert(6889,@test);
  MyCase.Insert(7056,@test);
  MyCase.Insert(7225,@test);
  MyCase.Insert(7396,@test);
  MyCase.Insert(7569,@test);
  MyCase.Insert(7744,@test);
  MyCase.Insert(7921,@test);
  MyCase.Insert(8100,@test);
  MyCase.Insert(8281,@test);
  MyCase.Insert(8464,@test);
  MyCase.Insert(8649,@test);
  MyCase.Insert(8836,@test);
  MyCase.Insert(9025,@test);
  MyCase.Insert(9216,@test);
  MyCase.Insert(9409,@test);
  MyCase.Insert(9604,@test);
  MyCase.Insert(9801,@test);
  MyCase.Insert(10000,@test);
  MyCase.Insert(10201,@test);
  MyCase.Insert(10404,@test);
  MyCase.Insert(10609,@test);
  MyCase.Insert(10816,@test);
  MyCase.Insert(11025,@test);
  MyCase.Insert(11236,@test);
  MyCase.Insert(11449,@test);
  MyCase.Insert(11664,@test);
  MyCase.Insert(11881,@test);
  MyCase.Insert(12100,@test);
  MyCase.Insert(12321,@test);
  MyCase.Insert(12544,@test);
  MyCase.Insert(12769,@test);
  MyCase.Insert(12996,@test);
  MyCase.Insert(13225,@test);
  MyCase.Insert(13456,@test);
  MyCase.Insert(13689,@test);
  MyCase.Insert(13924,@test);
  MyCase.Insert(14161,@test);
  MyCase.Insert(14400,@test);
  MyCase.Insert(14641,@test);
  MyCase.Insert(14884,@test);
  MyCase.Insert(15129,@test);
  MyCase.Insert(15376,@test);
  MyCase.Insert(15625,@test);
  MyCase.Insert(15876,@test);
  MyCase.Insert(16129,@test);
  MyCase.Insert(16384,@test);
  MyCase.Insert(16641,@test);
  MyCase.Insert(16900,@test);
  MyCase.Insert(17161,@test);
  MyCase.Insert(17424,@test);
  MyCase.Insert(17689,@test);
  MyCase.Insert(17956,@test);
  MyCase.Insert(18225,@test);
  MyCase.Insert(18496,@test);
  MyCase.Insert(18769,@test);
  MyCase.Insert(19044,@test);
  MyCase.Insert(19321,@test);
  MyCase.Insert(19600,@test);
  MyCase.Insert(19881,@test);
  MyCase.Insert(20164,@test);
  MyCase.Insert(20449,@test);
  MyCase.Insert(20736,@test);
  MyCase.Insert(21025,@test);
  MyCase.Insert(21316,@test);
  MyCase.Insert(21609,@test);
  MyCase.Insert(21904,@test);
  MyCase.Insert(22201,@test);
  MyCase.Insert(22500,@test);
  MyCase.Insert(22801,@test);
  MyCase.Insert(23104,@test);
  MyCase.Insert(23409,@test);
  MyCase.Insert(23716,@test);
  MyCase.Insert(24025,@test);
  MyCase.Insert(24336,@test);
  MyCase.Insert(24649,@test);
  MyCase.Insert(24964,@test);
  MyCase.Insert(25281,@test);
  MyCase.Insert(25600,@test);
  MyCase.Insert(25921,@test);
  MyCase.Insert(26244,@test);
  MyCase.Insert(26569,@test);
  MyCase.Insert(26896,@test);
  MyCase.Insert(27225,@test);
  MyCase.Insert(27556,@test);
  MyCase.Insert(27889,@test);
  MyCase.Insert(28224,@test);
  MyCase.Insert(28561,@test);
  MyCase.Insert(28900,@test);
  MyCase.Insert(29241,@test);
  MyCase.Insert(29584,@test);
  MyCase.Insert(29929,@test);
  MyCase.Insert(30276,@test);
  MyCase.Insert(30625,@test);
  MyCase.Insert(30976,@test);
  MyCase.Insert(31329,@test);
  MyCase.Insert(31684,@test);
  MyCase.Insert(32041,@test);
  MyCase.Insert(32400,@test);
  MyCase.Insert(32761,@test);
  MyCase.Insert(33124,@test);
  MyCase.Insert(33489,@test);
  MyCase.Insert(33856,@test);
  MyCase.Insert(34225,@test);
  MyCase.Insert(34596,@test);
  MyCase.Insert(34969,@test);
  MyCase.Insert(35344,@test);
  MyCase.Insert(35721,@test);
  MyCase.Insert(36100,@test);
  MyCase.Insert(36481,@test);
  MyCase.Insert(36864,@test);
  MyCase.Insert(37249,@test);
  MyCase.Insert(37636,@test);
  MyCase.Insert(38025,@test);
  MyCase.Insert(38416,@test);
  MyCase.Insert(38809,@test);
  MyCase.Insert(39204,@test);
  MyCase.Insert(39601,@test);
  MyCase.Insert(40000,@test);
  MyCase.Insert(40401,@test);
  MyCase.Insert(40804,@test);
  MyCase.Insert(41209,@test);
  MyCase.Insert(41616,@test);
  MyCase.Insert(42025,@test);
  MyCase.Insert(42436,@test);
  MyCase.Insert(42849,@test);
  MyCase.Insert(43264,@test);
  MyCase.Insert(43681,@test);
  MyCase.Insert(44100,@test);
  MyCase.Insert(44521,@test);
  MyCase.Insert(44944,@test);
  MyCase.Insert(45369,@test);
  MyCase.Insert(45796,@test);
  MyCase.Insert(46225,@test);
  MyCase.Insert(46656,@test);
  MyCase.Insert(47089,@test);
  MyCase.Insert(47524,@test);
  MyCase.Insert(47961,@test);
  MyCase.Insert(48400,@test);
  MyCase.Insert(48841,@test);
  MyCase.Insert(49284,@test);
  MyCase.Insert(49729,@test);
  MyCase.Insert(50176,@test);
  MyCase.Insert(50625,@test);
  MyCase.Insert(51076,@test);
  MyCase.Insert(51529,@test);
  MyCase.Insert(51984,@test);
  MyCase.Insert(52441,@test);
  MyCase.Insert(52900,@test);
  MyCase.Insert(53361,@test);
  MyCase.Insert(53824,@test);
  MyCase.Insert(54289,@test);
  MyCase.Insert(54756,@test);
  MyCase.Insert(55225,@test);
  MyCase.Insert(55696,@test);
  MyCase.Insert(56169,@test);
  MyCase.Insert(56644,@test);
  MyCase.Insert(57121,@test);
  MyCase.Insert(57600,@test);
  MyCase.Insert(58081,@test);
  MyCase.Insert(58564,@test);
  MyCase.Insert(59049,@test);
  MyCase.Insert(59536,@test);
  MyCase.Insert(60025,@test);
  MyCase.Insert(60516,@test);
  MyCase.Insert(61009,@test);
  MyCase.Insert(61504,@test);
  MyCase.Insert(62001,@test);
  MyCase.Insert(62500,@test);
  MyCase.Insert(63001,@test);
  MyCase.Insert(63504,@test);
  MyCase.Insert(64009,@test);
  MyCase.Insert(64516,@test);
  MyCase.Insert(65025,@test);
  MyCase.Insert(65536,@test);
  MyCase.Insert(66049,@test);
  MyCase.Insert(66564,@test);
  MyCase.Insert(67081,@test);
  MyCase.Insert(67600,@test);
  MyCase.Insert(68121,@test);
  MyCase.Insert(68644,@test);
  MyCase.Insert(69169,@test);
  MyCase.Insert(69696,@test);
  MyCase.Insert(70225,@test);
  MyCase.Insert(70756,@test);
  MyCase.Insert(71289,@test);
  MyCase.Insert(71824,@test);
  MyCase.Insert(72361,@test);
  MyCase.Insert(72900,@test);
  MyCase.Insert(73441,@test);
  MyCase.Insert(73984,@test);
  MyCase.Insert(74529,@test);
  MyCase.Insert(75076,@test);
  MyCase.Insert(75625,@test);
  MyCase.Insert(76176,@test);
  MyCase.Insert(76729,@test);
  MyCase.Insert(77284,@test);
  MyCase.Insert(77841,@test);
  MyCase.Insert(78400,@test);
  MyCase.Insert(78961,@test);
  MyCase.Insert(79524,@test);
  MyCase.Insert(80089,@test);
  MyCase.Insert(80656,@test);
  MyCase.Insert(81225,@test);
  MyCase.Insert(81796,@test);
  MyCase.Insert(82369,@test);
  MyCase.Insert(82944,@test);
  MyCase.Insert(83521,@test);
  MyCase.Insert(84100,@test);
  MyCase.Insert(84681,@test);
  MyCase.Insert(85264,@test);
  MyCase.Insert(85849,@test);
  MyCase.Insert(86436,@test);
  MyCase.Insert(87025,@test);
  MyCase.Insert(87616,@test);
  MyCase.Insert(88209,@test);
  MyCase.Insert(88804,@test);
  MyCase.Insert(89401,@test);
  MyCase.Insert(90000,@test);
  MyCase.Insert(90601,@test);
  MyCase.Insert(91204,@test);
  MyCase.Insert(91809,@test);
  MyCase.Insert(92416,@test);
  MyCase.Insert(93025,@test);
  MyCase.Insert(93636,@test);
  MyCase.Insert(94249,@test);
  MyCase.Insert(94864,@test);
  MyCase.Insert(95481,@test);
  MyCase.Insert(96100,@test);
  MyCase.Insert(96721,@test);
  MyCase.Insert(97344,@test);
  MyCase.Insert(97969,@test);
  MyCase.Insert(98596,@test);
  MyCase.Insert(99225,@test);
  MyCase.Insert(99856,@test);
  MyCase.Insert(100489,@test);
  MyCase.Insert(101124,@test);
  MyCase.Insert(101761,@test);
  MyCase.Insert(102400,@test);
  MyCase.Insert(103041,@test);
  MyCase.Insert(103684,@test);
  MyCase.Insert(104329,@test);
  MyCase.Insert(104976,@test);
  MyCase.Insert(105625,@test);
  MyCase.Insert(106276,@test);
  MyCase.Insert(106929,@test);
  MyCase.Insert(107584,@test);
  MyCase.Insert(108241,@test);
  MyCase.Insert(108900,@test);
  MyCase.Insert(109561,@test);
  MyCase.Insert(110224,@test);
  MyCase.Insert(110889,@test);
  MyCase.Insert(111556,@test);
  MyCase.Insert(112225,@test);
  MyCase.Insert(112896,@test);
  MyCase.Insert(113569,@test);
  MyCase.Insert(114244,@test);
  MyCase.Insert(114921,@test);
  MyCase.Insert(115600,@test);
  MyCase.Insert(116281,@test);
  MyCase.Insert(116964,@test);
  MyCase.Insert(117649,@test);
  MyCase.Insert(118336,@test);
  MyCase.Insert(119025,@test);
  MyCase.Insert(119716,@test);
  MyCase.Insert(120409,@test);
  MyCase.Insert(121104,@test);
  MyCase.Insert(121801,@test);
  MyCase.Insert(122500,@test);
  MyCase.Insert(123201,@test);
  MyCase.Insert(123904,@test);
  MyCase.Insert(124609,@test);
  MyCase.Insert(125316,@test);
  MyCase.Insert(126025,@test);
  MyCase.Insert(126736,@test);
  MyCase.Insert(127449,@test);
  MyCase.Insert(128164,@test);
  MyCase.Insert(128881,@test);
  MyCase.Insert(129600,@test);
  MyCase.Insert(130321,@test);
  MyCase.Insert(131044,@test);
  MyCase.Insert(131769,@test);
  MyCase.Insert(132496,@test);
  MyCase.Insert(133225,@test);
  MyCase.Insert(133956,@test);
  MyCase.Insert(134689,@test);
  MyCase.Insert(135424,@test);
  MyCase.Insert(136161,@test);
  MyCase.Insert(136900,@test);
  MyCase.Insert(137641,@test);
  MyCase.Insert(138384,@test);
  MyCase.Insert(139129,@test);
  MyCase.Insert(139876,@test);
  MyCase.Insert(140625,@test);
  MyCase.Insert(141376,@test);
  MyCase.Insert(142129,@test);
  MyCase.Insert(142884,@test);
  MyCase.Insert(143641,@test);
  MyCase.Insert(144400,@test);
  MyCase.Insert(145161,@test);
  MyCase.Insert(145924,@test);
  MyCase.Insert(146689,@test);
  MyCase.Insert(147456,@test);
  MyCase.Insert(148225,@test);
  MyCase.Insert(148996,@test);
  MyCase.Insert(149769,@test);
  MyCase.Insert(150544,@test);
  MyCase.Insert(151321,@test);
  MyCase.Insert(152100,@test);
  MyCase.Insert(152881,@test);
  MyCase.Insert(153664,@test);
  MyCase.Insert(154449,@test);
  MyCase.Insert(155236,@test);
  MyCase.Insert(156025,@test);
  MyCase.Insert(156816,@test);
  MyCase.Insert(157609,@test);
  MyCase.Insert(158404,@test);
  MyCase.Insert(159201,@test);
  MyCase.Insert(160000,@test);
  MyCase.Insert(160801,@test);
  MyCase.Insert(161604,@test);
  MyCase.Insert(162409,@test);
  MyCase.Insert(163216,@test);
  MyCase.Insert(164025,@test);
  MyCase.Insert(164836,@test);
  MyCase.Insert(165649,@test);
  MyCase.Insert(166464,@test);
  MyCase.Insert(167281,@test);
  MyCase.Insert(168100,@test);
  MyCase.Insert(168921,@test);
  MyCase.Insert(169744,@test);
  MyCase.Insert(170569,@test);
  MyCase.Insert(171396,@test);
  MyCase.Insert(172225,@test);
  MyCase.Insert(173056,@test);
  MyCase.Insert(173889,@test);
  MyCase.Insert(174724,@test);
  MyCase.Insert(175561,@test);
  MyCase.Insert(176400,@test);
  MyCase.Insert(177241,@test);
  MyCase.Insert(178084,@test);
  MyCase.Insert(178929,@test);
  MyCase.Insert(179776,@test);
  MyCase.Insert(180625,@test);
  MyCase.Insert(181476,@test);
  MyCase.Insert(182329,@test);
  MyCase.Insert(183184,@test);
  MyCase.Insert(184041,@test);
  MyCase.Insert(184900,@test);
  MyCase.Insert(185761,@test);
  MyCase.Insert(186624,@test);
  MyCase.Insert(187489,@test);
  MyCase.Insert(188356,@test);
  MyCase.Insert(189225,@test);
  MyCase.Insert(190096,@test);
  MyCase.Insert(190969,@test);
  MyCase.Insert(191844,@test);
  MyCase.Insert(192721,@test);
  MyCase.Insert(193600,@test);
  MyCase.Insert(194481,@test);
  MyCase.Insert(195364,@test);
  MyCase.Insert(196249,@test);
  MyCase.Insert(197136,@test);
  MyCase.Insert(198025,@test);
  MyCase.Insert(198916,@test);
  MyCase.Insert(199809,@test);
  MyCase.Insert(200704,@test);
  MyCase.Insert(201601,@test);
  MyCase.Insert(202500,@test);
  MyCase.Insert(203401,@test);
  MyCase.Insert(204304,@test);
  MyCase.Insert(205209,@test);
  MyCase.Insert(206116,@test);
  MyCase.Insert(207025,@test);
  MyCase.Insert(207936,@test);
  MyCase.Insert(208849,@test);
  MyCase.Insert(209764,@test);
  MyCase.Insert(210681,@test);
  MyCase.Insert(211600,@test);
  MyCase.Insert(212521,@test);
  MyCase.Insert(213444,@test);
  MyCase.Insert(214369,@test);
  MyCase.Insert(215296,@test);
  MyCase.Insert(216225,@test);
  MyCase.Insert(217156,@test);
  MyCase.Insert(218089,@test);
  MyCase.Insert(219024,@test);
  MyCase.Insert(219961,@test);
  MyCase.Insert(220900,@test);
  MyCase.Insert(221841,@test);
  MyCase.Insert(222784,@test);
  MyCase.Insert(223729,@test);
  MyCase.Insert(224676,@test);
  MyCase.Insert(225625,@test);
  MyCase.Insert(226576,@test);
  MyCase.Insert(227529,@test);
  MyCase.Insert(228484,@test);
  MyCase.Insert(229441,@test);
  MyCase.Insert(230400,@test);
  MyCase.Insert(231361,@test);
  MyCase.Insert(232324,@test);
  MyCase.Insert(233289,@test);
  MyCase.Insert(234256,@test);
  MyCase.Insert(235225,@test);
  MyCase.Insert(236196,@test);
  MyCase.Insert(237169,@test);
  MyCase.Insert(238144,@test);
  MyCase.Insert(239121,@test);
  MyCase.Insert(240100,@test);
  MyCase.Insert(241081,@test);
  MyCase.Insert(242064,@test);
  MyCase.Insert(243049,@test);
  MyCase.Insert(244036,@test);
  MyCase.Insert(245025,@test);
  MyCase.Insert(246016,@test);
  MyCase.Insert(247009,@test);
  MyCase.Insert(248004,@test);
  MyCase.Insert(249001,@test);
  MyCase.Insert(250000,@test);
  MyCase.Insert(251001,@test);
  MyCase.Insert(252004,@test);
  MyCase.Insert(253009,@test);
  MyCase.Insert(254016,@test);
  MyCase.Insert(255025,@test);
  MyCase.Insert(256036,@test);
  MyCase.Insert(257049,@test);
  MyCase.Insert(258064,@test);
  MyCase.Insert(259081,@test);
  MyCase.Insert(260100,@test);
  MyCase.Insert(261121,@test);
  MyCase.Insert(262144,@test);
  MyCase.Insert(263169,@test);
  MyCase.Insert(264196,@test);
  MyCase.Insert(265225,@test);
  MyCase.Insert(266256,@test);
  MyCase.Insert(267289,@test);
  MyCase.Insert(268324,@test);
  MyCase.Insert(269361,@test);
  MyCase.Insert(270400,@test);
  MyCase.Insert(271441,@test);
  MyCase.Insert(272484,@test);
  MyCase.Insert(273529,@test);
  MyCase.Insert(274576,@test);
  MyCase.Insert(275625,@test);
  MyCase.Insert(276676,@test);
  MyCase.Insert(277729,@test);
  MyCase.Insert(278784,@test);
  MyCase.Insert(279841,@test);
  MyCase.Insert(280900,@test);
  MyCase.Insert(281961,@test);
  MyCase.Insert(283024,@test);
  MyCase.Insert(284089,@test);
  MyCase.Insert(285156,@test);
  MyCase.Insert(286225,@test);
  MyCase.Insert(287296,@test);
  MyCase.Insert(288369,@test);
  MyCase.Insert(289444,@test);
  MyCase.Insert(290521,@test);
  MyCase.Insert(291600,@test);
  MyCase.Insert(292681,@test);
  MyCase.Insert(293764,@test);
  MyCase.Insert(294849,@test);
  MyCase.Insert(295936,@test);
  MyCase.Insert(297025,@test);
  MyCase.Insert(298116,@test);
  MyCase.Insert(299209,@test);
  MyCase.Insert(300304,@test);
  MyCase.Insert(301401,@test);
  MyCase.Insert(302500,@test);
  MyCase.Insert(303601,@test);
  MyCase.Insert(304704,@test);
  MyCase.Insert(305809,@test);
  MyCase.Insert(306916,@test);
  MyCase.Insert(308025,@test);
  MyCase.Insert(309136,@test);
  MyCase.Insert(310249,@test);
  MyCase.Insert(311364,@test);
  MyCase.Insert(312481,@test);
  MyCase.Insert(313600,@test);
  MyCase.Insert(314721,@test);
  MyCase.Insert(315844,@test);
  MyCase.Insert(316969,@test);
  MyCase.Insert(318096,@test);
  MyCase.Insert(319225,@test);
  MyCase.Insert(320356,@test);
  MyCase.Insert(321489,@test);
  MyCase.Insert(322624,@test);
  MyCase.Insert(323761,@test);
  MyCase.Insert(324900,@test);
  MyCase.Insert(326041,@test);
  MyCase.Insert(327184,@test);
  MyCase.Insert(328329,@test);
  MyCase.Insert(329476,@test);
  MyCase.Insert(330625,@test);
  MyCase.Insert(331776,@test);
  MyCase.Insert(332929,@test);
  MyCase.Insert(334084,@test);
  MyCase.Insert(335241,@test);
  MyCase.Insert(336400,@test);
  MyCase.Insert(337561,@test);
  MyCase.Insert(338724,@test);
  MyCase.Insert(339889,@test);
  MyCase.Insert(341056,@test);
  MyCase.Insert(342225,@test);
  MyCase.Insert(343396,@test);
  MyCase.Insert(344569,@test);
  MyCase.Insert(345744,@test);
  MyCase.Insert(346921,@test);
  MyCase.Insert(348100,@test);
  MyCase.Insert(349281,@test);
  MyCase.Insert(350464,@test);
  MyCase.Insert(351649,@test);
  MyCase.Insert(352836,@test);
  MyCase.Insert(354025,@test);
  MyCase.Insert(355216,@test);
  MyCase.Insert(356409,@test);
  MyCase.Insert(357604,@test);
  MyCase.Insert(358801,@test);
  MyCase.Insert(360000,@test);
  MyCase.Insert(361201,@test);
  MyCase.Insert(362404,@test);
  MyCase.Insert(363609,@test);
  MyCase.Insert(364816,@test);
  MyCase.Insert(366025,@test);
  MyCase.Insert(367236,@test);
  MyCase.Insert(368449,@test);
  MyCase.Insert(369664,@test);
  MyCase.Insert(370881,@test);
  MyCase.Insert(372100,@test);
  MyCase.Insert(373321,@test);
  MyCase.Insert(374544,@test);
  MyCase.Insert(375769,@test);
  MyCase.Insert(376996,@test);
  MyCase.Insert(378225,@test);
  MyCase.Insert(379456,@test);
  MyCase.Insert(380689,@test);
  MyCase.Insert(381924,@test);
  MyCase.Insert(383161,@test);
  MyCase.Insert(384400,@test);
  MyCase.Insert(385641,@test);
  MyCase.Insert(386884,@test);
  MyCase.Insert(388129,@test);
  MyCase.Insert(389376,@test);
  MyCase.Insert(390625,@test);
  MyCase.Insert(391876,@test);
  MyCase.Insert(393129,@test);
  MyCase.Insert(394384,@test);
  MyCase.Insert(395641,@test);
  MyCase.Insert(396900,@test);
  MyCase.Insert(398161,@test);
  MyCase.Insert(399424,@test);
  MyCase.Insert(400689,@test);
  MyCase.Insert(401956,@test);
  MyCase.Insert(403225,@test);
  MyCase.Insert(404496,@test);
  MyCase.Insert(405769,@test);
  MyCase.Insert(407044,@test);
  MyCase.Insert(408321,@test);
  MyCase.Insert(409600,@test);
  MyCase.Insert(410881,@test);
  MyCase.Insert(412164,@test);
  MyCase.Insert(413449,@test);
  MyCase.Insert(414736,@test);
  MyCase.Insert(416025,@test);
  MyCase.Insert(417316,@test);
  MyCase.Insert(418609,@test);
  MyCase.Insert(419904,@test);
  MyCase.Insert(421201,@test);
  MyCase.Insert(422500,@test);
  MyCase.Insert(423801,@test);
  MyCase.Insert(425104,@test);
  MyCase.Insert(426409,@test);
  MyCase.Insert(427716,@test);
  MyCase.Insert(429025,@test);
  MyCase.Insert(430336,@test);
  MyCase.Insert(431649,@test);
  MyCase.Insert(432964,@test);
  MyCase.Insert(434281,@test);
  MyCase.Insert(435600,@test);
  MyCase.Insert(436921,@test);
  MyCase.Insert(438244,@test);
  MyCase.Insert(439569,@test);
  MyCase.Insert(440896,@test);
  MyCase.Insert(442225,@test);
  MyCase.Insert(443556,@test);
  MyCase.Insert(444889,@test);
  MyCase.Insert(446224,@test);
  MyCase.Insert(447561,@test);
  MyCase.Insert(448900,@test);
  MyCase.Insert(450241,@test);
  MyCase.Insert(451584,@test);
  MyCase.Insert(452929,@test);
  MyCase.Insert(454276,@test);
  MyCase.Insert(455625,@test);
  MyCase.Insert(456976,@test);
  MyCase.Insert(458329,@test);
  MyCase.Insert(459684,@test);
  MyCase.Insert(461041,@test);
  MyCase.Insert(462400,@test);
  MyCase.Insert(463761,@test);
  MyCase.Insert(465124,@test);
  MyCase.Insert(466489,@test);
  MyCase.Insert(467856,@test);
  MyCase.Insert(469225,@test);
  MyCase.Insert(470596,@test);
  MyCase.Insert(471969,@test);
  MyCase.Insert(473344,@test);
  MyCase.Insert(474721,@test);
  MyCase.Insert(476100,@test);
  MyCase.Insert(477481,@test);
  MyCase.Insert(478864,@test);
  MyCase.Insert(480249,@test);
  MyCase.Insert(481636,@test);
  MyCase.Insert(483025,@test);
  MyCase.Insert(484416,@test);
  MyCase.Insert(485809,@test);
  MyCase.Insert(487204,@test);
  MyCase.Insert(488601,@test);
  MyCase.Insert(490000,@test);
  MyCase.Insert(491401,@test);
  MyCase.Insert(492804,@test);
  MyCase.Insert(494209,@test);
  MyCase.Insert(495616,@test);
  MyCase.Insert(497025,@test);
  MyCase.Insert(498436,@test);
  MyCase.Insert(499849,@test);
  MyCase.Insert(501264,@test);
  MyCase.Insert(502681,@test);
  MyCase.Insert(504100,@test);
  MyCase.Insert(505521,@test);
  MyCase.Insert(506944,@test);
  MyCase.Insert(508369,@test);
  MyCase.Insert(509796,@test);
  MyCase.Insert(511225,@test);
  MyCase.Insert(512656,@test);
  MyCase.Insert(514089,@test);
  MyCase.Insert(515524,@test);
  MyCase.Insert(516961,@test);
  MyCase.Insert(518400,@test);
  MyCase.Insert(519841,@test);
  MyCase.Insert(521284,@test);
  MyCase.Insert(522729,@test);
  MyCase.Insert(524176,@test);
  MyCase.Insert(525625,@test);
  MyCase.Insert(527076,@test);
  MyCase.Insert(528529,@test);
  MyCase.Insert(529984,@test);
  MyCase.Insert(531441,@test);
  MyCase.Insert(532900,@test);
  MyCase.Insert(534361,@test);
  MyCase.Insert(535824,@test);
  MyCase.Insert(537289,@test);
  MyCase.Insert(538756,@test);
  MyCase.Insert(540225,@test);
  MyCase.Insert(541696,@test);
  MyCase.Insert(543169,@test);
  MyCase.Insert(544644,@test);
  MyCase.Insert(546121,@test);
  MyCase.Insert(547600,@test);
  MyCase.Insert(549081,@test);
  MyCase.Insert(550564,@test);
  MyCase.Insert(552049,@test);
  MyCase.Insert(553536,@test);
  MyCase.Insert(555025,@test);
  MyCase.Insert(556516,@test);
  MyCase.Insert(558009,@test);
  MyCase.Insert(559504,@test);
  MyCase.Insert(561001,@test);
  MyCase.Insert(562500,@test);
  MyCase.Insert(564001,@test);
  MyCase.Insert(565504,@test);
  MyCase.Insert(567009,@test);
  MyCase.Insert(568516,@test);
  MyCase.Insert(570025,@test);
  MyCase.Insert(571536,@test);
  MyCase.Insert(573049,@test);
  MyCase.Insert(574564,@test);
  MyCase.Insert(576081,@test);
  MyCase.Insert(577600,@test);
  MyCase.Insert(579121,@test);
  MyCase.Insert(580644,@test);
  MyCase.Insert(582169,@test);
  MyCase.Insert(583696,@test);
  MyCase.Insert(585225,@test);
  MyCase.Insert(586756,@test);
  MyCase.Insert(588289,@test);
  MyCase.Insert(589824,@test);
  MyCase.Insert(591361,@test);
  MyCase.Insert(592900,@test);
  MyCase.Insert(594441,@test);
  MyCase.Insert(595984,@test);
  MyCase.Insert(597529,@test);
  MyCase.Insert(599076,@test);
  MyCase.Insert(600625,@test);
  MyCase.Insert(602176,@test);
  MyCase.Insert(603729,@test);
  MyCase.Insert(605284,@test);
  MyCase.Insert(606841,@test);
  MyCase.Insert(608400,@test);
  MyCase.Insert(609961,@test);
  MyCase.Insert(611524,@test);
  MyCase.Insert(613089,@test);
  MyCase.Insert(614656,@test);
  MyCase.Insert(616225,@test);
  MyCase.Insert(617796,@test);
  MyCase.Insert(619369,@test);
  MyCase.Insert(620944,@test);
  MyCase.Insert(622521,@test);
  MyCase.Insert(624100,@test);
  MyCase.Insert(625681,@test);
  MyCase.Insert(627264,@test);
  MyCase.Insert(628849,@test);
  MyCase.Insert(630436,@test);
  MyCase.Insert(632025,@test);
  MyCase.Insert(633616,@test);
  MyCase.Insert(635209,@test);
  MyCase.Insert(636804,@test);
  MyCase.Insert(638401,@test);
  MyCase.Insert(640000,@test);
  MyCase.Insert(641601,@test);
  MyCase.Insert(643204,@test);
  MyCase.Insert(644809,@test);
  MyCase.Insert(646416,@test);
  MyCase.Insert(648025,@test);
  MyCase.Insert(649636,@test);
  MyCase.Insert(651249,@test);
  MyCase.Insert(652864,@test);
  MyCase.Insert(654481,@test);
  MyCase.Insert(656100,@test);
  MyCase.Insert(657721,@test);
  MyCase.Insert(659344,@test);
  MyCase.Insert(660969,@test);
  MyCase.Insert(662596,@test);
  MyCase.Insert(664225,@test);
  MyCase.Insert(665856,@test);
  MyCase.Insert(667489,@test);
  MyCase.Insert(669124,@test);
  MyCase.Insert(670761,@test);
  MyCase.Insert(672400,@test);
  MyCase.Insert(674041,@test);
  MyCase.Insert(675684,@test);
  MyCase.Insert(677329,@test);
  MyCase.Insert(678976,@test);
  MyCase.Insert(680625,@test);
  MyCase.Insert(682276,@test);
  MyCase.Insert(683929,@test);
  MyCase.Insert(685584,@test);
  MyCase.Insert(687241,@test);
  MyCase.Insert(688900,@test);
  MyCase.Insert(690561,@test);
  MyCase.Insert(692224,@test);
  MyCase.Insert(693889,@test);
  MyCase.Insert(695556,@test);
  MyCase.Insert(697225,@test);
  MyCase.Insert(698896,@test);
  MyCase.Insert(700569,@test);
  MyCase.Insert(702244,@test);
  MyCase.Insert(703921,@test);
  MyCase.Insert(705600,@test);
  MyCase.Insert(707281,@test);
  MyCase.Insert(708964,@test);
  MyCase.Insert(710649,@test);
  MyCase.Insert(712336,@test);
  MyCase.Insert(714025,@test);
  MyCase.Insert(715716,@test);
  MyCase.Insert(717409,@test);
  MyCase.Insert(719104,@test);
  MyCase.Insert(720801,@test);
  MyCase.Insert(722500,@test);
  MyCase.Insert(724201,@test);
  MyCase.Insert(725904,@test);
  MyCase.Insert(727609,@test);
  MyCase.Insert(729316,@test);
  MyCase.Insert(731025,@test);
  MyCase.Insert(732736,@test);
  MyCase.Insert(734449,@test);
  MyCase.Insert(736164,@test);
  MyCase.Insert(737881,@test);
  MyCase.Insert(739600,@test);
  MyCase.Insert(741321,@test);
  MyCase.Insert(743044,@test);
  MyCase.Insert(744769,@test);
  MyCase.Insert(746496,@test);
  MyCase.Insert(748225,@test);
  MyCase.Insert(749956,@test);
  MyCase.Insert(751689,@test);
  MyCase.Insert(753424,@test);
  MyCase.Insert(755161,@test);
  MyCase.Insert(756900,@test);
  MyCase.Insert(758641,@test);
  MyCase.Insert(760384,@test);
  MyCase.Insert(762129,@test);
  MyCase.Insert(763876,@test);
  MyCase.Insert(765625,@test);
  MyCase.Insert(767376,@test);
  MyCase.Insert(769129,@test);
  MyCase.Insert(770884,@test);
  MyCase.Insert(772641,@test);
  MyCase.Insert(774400,@test);
  MyCase.Insert(776161,@test);
  MyCase.Insert(777924,@test);
  MyCase.Insert(779689,@test);
  MyCase.Insert(781456,@test);
  MyCase.Insert(783225,@test);
  MyCase.Insert(784996,@test);
  MyCase.Insert(786769,@test);
  MyCase.Insert(788544,@test);
  MyCase.Insert(790321,@test);
  MyCase.Insert(792100,@test);
  MyCase.Insert(793881,@test);
  MyCase.Insert(795664,@test);
  MyCase.Insert(797449,@test);
  MyCase.Insert(799236,@test);
  MyCase.Insert(801025,@test);
  MyCase.Insert(802816,@test);
  MyCase.Insert(804609,@test);
  MyCase.Insert(806404,@test);
  MyCase.Insert(808201,@test);
  MyCase.Insert(810000,@test);
  MyCase.Insert(811801,@test);
  MyCase.Insert(813604,@test);
  MyCase.Insert(815409,@test);
  MyCase.Insert(817216,@test);
  MyCase.Insert(819025,@test);
  MyCase.Insert(820836,@test);
  MyCase.Insert(822649,@test);
  MyCase.Insert(824464,@test);
  MyCase.Insert(826281,@test);
  MyCase.Insert(828100,@test);
  MyCase.Insert(829921,@test);
  MyCase.Insert(831744,@test);
  MyCase.Insert(833569,@test);
  MyCase.Insert(835396,@test);
  MyCase.Insert(837225,@test);
  MyCase.Insert(839056,@test);
  MyCase.Insert(840889,@test);
  MyCase.Insert(842724,@test);
  MyCase.Insert(844561,@test);
  MyCase.Insert(846400,@test);
  MyCase.Insert(848241,@test);
  MyCase.Insert(850084,@test);
  MyCase.Insert(851929,@test);
  MyCase.Insert(853776,@test);
  MyCase.Insert(855625,@test);
  MyCase.Insert(857476,@test);
  MyCase.Insert(859329,@test);
  MyCase.Insert(861184,@test);
  MyCase.Insert(863041,@test);
  MyCase.Insert(864900,@test);
  MyCase.Insert(866761,@test);
  MyCase.Insert(868624,@test);
  MyCase.Insert(870489,@test);
  MyCase.Insert(872356,@test);
  MyCase.Insert(874225,@test);
  MyCase.Insert(876096,@test);
  MyCase.Insert(877969,@test);
  MyCase.Insert(879844,@test);
  MyCase.Insert(881721,@test);
  MyCase.Insert(883600,@test);
  MyCase.Insert(885481,@test);
  MyCase.Insert(887364,@test);
  MyCase.Insert(889249,@test);
  MyCase.Insert(891136,@test);
  MyCase.Insert(893025,@test);
  MyCase.Insert(894916,@test);
  MyCase.Insert(896809,@test);
  MyCase.Insert(898704,@test);
  MyCase.Insert(900601,@test);
  MyCase.Insert(902500,@test);
  MyCase.Insert(904401,@test);
  MyCase.Insert(906304,@test);
  MyCase.Insert(908209,@test);
  MyCase.Insert(910116,@test);
  MyCase.Insert(912025,@test);
  MyCase.Insert(913936,@test);
  MyCase.Insert(915849,@test);
  MyCase.Insert(917764,@test);
  MyCase.Insert(919681,@test);
  MyCase.Insert(921600,@test);
  MyCase.Insert(923521,@test);
  MyCase.Insert(925444,@test);
  MyCase.Insert(927369,@test);
  MyCase.Insert(929296,@test);
  MyCase.Insert(931225,@test);
  MyCase.Insert(933156,@test);
  MyCase.Insert(935089,@test);
  MyCase.Insert(937024,@test);
  MyCase.Insert(938961,@test);
  MyCase.Insert(940900,@test);
  MyCase.Insert(942841,@test);
  MyCase.Insert(944784,@test);
  MyCase.Insert(946729,@test);
  MyCase.Insert(948676,@test);
  MyCase.Insert(950625,@test);
  MyCase.Insert(952576,@test);
  MyCase.Insert(954529,@test);
  MyCase.Insert(956484,@test);
  MyCase.Insert(958441,@test);
  MyCase.Insert(960400,@test);
  MyCase.Insert(962361,@test);
  MyCase.Insert(964324,@test);
  MyCase.Insert(966289,@test);
  MyCase.Insert(968256,@test);
  MyCase.Insert(970225,@test);
  MyCase.Insert(972196,@test);
  MyCase.Insert(974169,@test);
  MyCase.Insert(976144,@test);
  MyCase.Insert(978121,@test);
  MyCase.Insert(980100,@test);
  MyCase.Insert(982081,@test);
  MyCase.Insert(984064,@test);
  MyCase.Insert(986049,@test);
  MyCase.Insert(988036,@test);
  MyCase.Insert(990025,@test);
  MyCase.Insert(992016,@test);
  MyCase.Insert(994009,@test);
  MyCase.Insert(996004,@test);
  MyCase.Insert(998001,@test);
  MyCase.Insert(1000000,@test);
  MyCase.Insert(1002001,@test);
  MyCase.Insert(1004004,@test);
  MyCase.Insert(1006009,@test);
  MyCase.Insert(1008016,@test);
  MyCase.Insert(1010025,@test);
  MyCase.Insert(1012036,@test);
  MyCase.Insert(1014049,@test);
  MyCase.Insert(1016064,@test);
  MyCase.Insert(1018081,@test);
  MyCase.Insert(1020100,@test);
  MyCase.Insert(1022121,@test);
  MyCase.Insert(1024144,@test);
  MyCase.Insert(1026169,@test);
  MyCase.Insert(1028196,@test);
  MyCase.Insert(1030225,@test);
  MyCase.Insert(1032256,@test);
  MyCase.Insert(1034289,@test);
  MyCase.Insert(1036324,@test);
  MyCase.Insert(1038361,@test);
  MyCase.Insert(1040400,@test);
  MyCase.Insert(1042441,@test);
  MyCase.Insert(1044484,@test);
  MyCase.Insert(1046529,@test);
  str((now-myTime)*10e4:2:3,ts);
  writeln('Inserting '+ts+'sec.');

  myTime:=now;
  for i:=0 to 1046529 do
    MyCase.DoIt(i*i);
  str((now-myTime)*10e4:2:3,ts);
  writeln('DoIt '+ts+'sec.');

  MyCase.Destroy;
end.



У меня получилось: (без оптимизаций, насколько я понимаю чтоб получить оптимизированый fpc-stl надо пересобрать компилятор, недосук)
E:\testcase>E:\testcase\standartcase.exe
0.356sec.

E:\testcase>E:\testcase\case2map.exe
Inserting 0.001sec.
DoIt 0.093sec.


зы. исходник теста обычного касе не пролез изза ограничений длины сообщения. вставлю следующим сообщением. Напишите тут ченить, чтоб у меня было новое сообщение
Последний раз редактировалось zub 14.03.2017 00:09:29, всего редактировалось 2 раз(а).
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Адрес инструкции

Сообщение vitaly_l » 13.03.2017 23:48:49

zub писал(а):Напишите тут ченить, чтоб у меня было новое сообщение

Inserting 0.001sec.
DoIt 0.000sec.
Чё-то как-то совсем мало...
В чём подвох? Где Zub мухлюет?
Последний раз редактировалось vitaly_l 13.03.2017 23:53:07, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Адрес инструкции

Сообщение zub » 13.03.2017 23:52:54

O3, O4 - на результат standartcase не влияют, а имхо должны((
Код: Выделить всё
program standartcase;
uses sysutils;
procedure test(key:integer);
begin
  randseed:=key;
end;
var
   i:cardinal;
   myTime:TDateTime;
   ts:string;
begin
   myTime:=now;
   for i:=0 to 1046529 do
   case i of
      0: test(0);
      1: test(1);
      4: test(4);
      9: test(9);
      16: test(16);
      25: test(25);
      36: test(36);
      49: test(49);
      64: test(64);
      81: test(81);
      100: test(100);
      121: test(121);
      144: test(144);
      169: test(169);
      196: test(196);
      225: test(225);
      256: test(256);
      289: test(289);
      324: test(324);
      361: test(361);
      400: test(400);
      441: test(441);
      484: test(484);
      529: test(529);
      576: test(576);
      625: test(625);
      676: test(676);
      729: test(729);
      784: test(784);
      841: test(841);
      900: test(900);
      961: test(961);
      1024: test(1024);
      1089: test(1089);
      1156: test(1156);
      1225: test(1225);
      1296: test(1296);
      1369: test(1369);
      1444: test(1444);
      1521: test(1521);
      1600: test(1600);
      1681: test(1681);
      1764: test(1764);
      1849: test(1849);
      1936: test(1936);
      2025: test(2025);
      2116: test(2116);
      2209: test(2209);
      2304: test(2304);
      2401: test(2401);
      2500: test(2500);
      2601: test(2601);
      2704: test(2704);
      2809: test(2809);
      2916: test(2916);
      3025: test(3025);
      3136: test(3136);
      3249: test(3249);
      3364: test(3364);
      3481: test(3481);
      3600: test(3600);
      3721: test(3721);
      3844: test(3844);
      3969: test(3969);
      4096: test(4096);
      4225: test(4225);
      4356: test(4356);
      4489: test(4489);
      4624: test(4624);
      4761: test(4761);
      4900: test(4900);
      5041: test(5041);
      5184: test(5184);
      5329: test(5329);
      5476: test(5476);
      5625: test(5625);
      5776: test(5776);
      5929: test(5929);
      6084: test(6084);
      6241: test(6241);
      6400: test(6400);
      6561: test(6561);
      6724: test(6724);
      6889: test(6889);
      7056: test(7056);
      7225: test(7225);
      7396: test(7396);
      7569: test(7569);
      7744: test(7744);
      7921: test(7921);
      8100: test(8100);
      8281: test(8281);
      8464: test(8464);
      8649: test(8649);
      8836: test(8836);
      9025: test(9025);
      9216: test(9216);
      9409: test(9409);
      9604: test(9604);
      9801: test(9801);
      10000: test(10000);
      10201: test(10201);
      10404: test(10404);
      10609: test(10609);
      10816: test(10816);
      11025: test(11025);
      11236: test(11236);
      11449: test(11449);
      11664: test(11664);
      11881: test(11881);
      12100: test(12100);
      12321: test(12321);
      12544: test(12544);
      12769: test(12769);
      12996: test(12996);
      13225: test(13225);
      13456: test(13456);
      13689: test(13689);
      13924: test(13924);
      14161: test(14161);
      14400: test(14400);
      14641: test(14641);
      14884: test(14884);
      15129: test(15129);
      15376: test(15376);
      15625: test(15625);
      15876: test(15876);
      16129: test(16129);
      16384: test(16384);
      16641: test(16641);
      16900: test(16900);
      17161: test(17161);
      17424: test(17424);
      17689: test(17689);
      17956: test(17956);
      18225: test(18225);
      18496: test(18496);
      18769: test(18769);
      19044: test(19044);
      19321: test(19321);
      19600: test(19600);
      19881: test(19881);
      20164: test(20164);
      20449: test(20449);
      20736: test(20736);
      21025: test(21025);
      21316: test(21316);
      21609: test(21609);
      21904: test(21904);
      22201: test(22201);
      22500: test(22500);
      22801: test(22801);
      23104: test(23104);
      23409: test(23409);
      23716: test(23716);
      24025: test(24025);
      24336: test(24336);
      24649: test(24649);
      24964: test(24964);
      25281: test(25281);
      25600: test(25600);
      25921: test(25921);
      26244: test(26244);
      26569: test(26569);
      26896: test(26896);
      27225: test(27225);
      27556: test(27556);
      27889: test(27889);
      28224: test(28224);
      28561: test(28561);
      28900: test(28900);
      29241: test(29241);
      29584: test(29584);
      29929: test(29929);
      30276: test(30276);
      30625: test(30625);
      30976: test(30976);
      31329: test(31329);
      31684: test(31684);
      32041: test(32041);
      32400: test(32400);
      32761: test(32761);
      33124: test(33124);
      33489: test(33489);
      33856: test(33856);
      34225: test(34225);
      34596: test(34596);
      34969: test(34969);
      35344: test(35344);
      35721: test(35721);
      36100: test(36100);
      36481: test(36481);
      36864: test(36864);
      37249: test(37249);
      37636: test(37636);
      38025: test(38025);
      38416: test(38416);
      38809: test(38809);
      39204: test(39204);
      39601: test(39601);
      40000: test(40000);
      40401: test(40401);
      40804: test(40804);
      41209: test(41209);
      41616: test(41616);
      42025: test(42025);
      42436: test(42436);
      42849: test(42849);
      43264: test(43264);
      43681: test(43681);
      44100: test(44100);
      44521: test(44521);
      44944: test(44944);
      45369: test(45369);
      45796: test(45796);
      46225: test(46225);
      46656: test(46656);
      47089: test(47089);
      47524: test(47524);
      47961: test(47961);
      48400: test(48400);
      48841: test(48841);
      49284: test(49284);
      49729: test(49729);
      50176: test(50176);
      50625: test(50625);
      51076: test(51076);
      51529: test(51529);
      51984: test(51984);
      52441: test(52441);
      52900: test(52900);
      53361: test(53361);
      53824: test(53824);
      54289: test(54289);
      54756: test(54756);
      55225: test(55225);
      55696: test(55696);
      56169: test(56169);
      56644: test(56644);
      57121: test(57121);
      57600: test(57600);
      58081: test(58081);
      58564: test(58564);
      59049: test(59049);
      59536: test(59536);
      60025: test(60025);
      60516: test(60516);
      61009: test(61009);
      61504: test(61504);
      62001: test(62001);
      62500: test(62500);
      63001: test(63001);
      63504: test(63504);
      64009: test(64009);
      64516: test(64516);
      65025: test(65025);
      65536: test(65536);
      66049: test(66049);
      66564: test(66564);
      67081: test(67081);
      67600: test(67600);
      68121: test(68121);
      68644: test(68644);
      69169: test(69169);
      69696: test(69696);
      70225: test(70225);
      70756: test(70756);
      71289: test(71289);
      71824: test(71824);
      72361: test(72361);
      72900: test(72900);
      73441: test(73441);
      73984: test(73984);
      74529: test(74529);
      75076: test(75076);
      75625: test(75625);
      76176: test(76176);
      76729: test(76729);
      77284: test(77284);
      77841: test(77841);
      78400: test(78400);
      78961: test(78961);
      79524: test(79524);
      80089: test(80089);
      80656: test(80656);
      81225: test(81225);
      81796: test(81796);
      82369: test(82369);
      82944: test(82944);
      83521: test(83521);
      84100: test(84100);
      84681: test(84681);
      85264: test(85264);
      85849: test(85849);
      86436: test(86436);
      87025: test(87025);
      87616: test(87616);
      88209: test(88209);
      88804: test(88804);
      89401: test(89401);
      90000: test(90000);
      90601: test(90601);
      91204: test(91204);
      91809: test(91809);
      92416: test(92416);
      93025: test(93025);
      93636: test(93636);
      94249: test(94249);
      94864: test(94864);
      95481: test(95481);
      96100: test(96100);
      96721: test(96721);
      97344: test(97344);
      97969: test(97969);
      98596: test(98596);
      99225: test(99225);
      99856: test(99856);
      100489: test(100489);
      101124: test(101124);
      101761: test(101761);
      102400: test(102400);
      103041: test(103041);
      103684: test(103684);
      104329: test(104329);
      104976: test(104976);
      105625: test(105625);
      106276: test(106276);
      106929: test(106929);
      107584: test(107584);
      108241: test(108241);
      108900: test(108900);
      109561: test(109561);
      110224: test(110224);
      110889: test(110889);
      111556: test(111556);
      112225: test(112225);
      112896: test(112896);
      113569: test(113569);
      114244: test(114244);
      114921: test(114921);
      115600: test(115600);
      116281: test(116281);
      116964: test(116964);
      117649: test(117649);
      118336: test(118336);
      119025: test(119025);
      119716: test(119716);
      120409: test(120409);
      121104: test(121104);
      121801: test(121801);
      122500: test(122500);
      123201: test(123201);
      123904: test(123904);
      124609: test(124609);
      125316: test(125316);
      126025: test(126025);
      126736: test(126736);
      127449: test(127449);
      128164: test(128164);
      128881: test(128881);
      129600: test(129600);
      130321: test(130321);
      131044: test(131044);
      131769: test(131769);
      132496: test(132496);
      133225: test(133225);
      133956: test(133956);
      134689: test(134689);
      135424: test(135424);
      136161: test(136161);
      136900: test(136900);
      137641: test(137641);
      138384: test(138384);
      139129: test(139129);
      139876: test(139876);
      140625: test(140625);
      141376: test(141376);
      142129: test(142129);
      142884: test(142884);
      143641: test(143641);
      144400: test(144400);
      145161: test(145161);
      145924: test(145924);
      146689: test(146689);
      147456: test(147456);
      148225: test(148225);
      148996: test(148996);
      149769: test(149769);
      150544: test(150544);
      151321: test(151321);
      152100: test(152100);
      152881: test(152881);
      153664: test(153664);
      154449: test(154449);
      155236: test(155236);
      156025: test(156025);
      156816: test(156816);
      157609: test(157609);
      158404: test(158404);
      159201: test(159201);
      160000: test(160000);
      160801: test(160801);
      161604: test(161604);
      162409: test(162409);
      163216: test(163216);
      164025: test(164025);
      164836: test(164836);
      165649: test(165649);
      166464: test(166464);
      167281: test(167281);
      168100: test(168100);
      168921: test(168921);
      169744: test(169744);
      170569: test(170569);
      171396: test(171396);
      172225: test(172225);
      173056: test(173056);
      173889: test(173889);
      174724: test(174724);
      175561: test(175561);
      176400: test(176400);
      177241: test(177241);
      178084: test(178084);
      178929: test(178929);
      179776: test(179776);
      180625: test(180625);
      181476: test(181476);
      182329: test(182329);
      183184: test(183184);
      184041: test(184041);
      184900: test(184900);
      185761: test(185761);
      186624: test(186624);
      187489: test(187489);
      188356: test(188356);
      189225: test(189225);
      190096: test(190096);
      190969: test(190969);
      191844: test(191844);
      192721: test(192721);
      193600: test(193600);
      194481: test(194481);
      195364: test(195364);
      196249: test(196249);
      197136: test(197136);
      198025: test(198025);
      198916: test(198916);
      199809: test(199809);
      200704: test(200704);
      201601: test(201601);
      202500: test(202500);
      203401: test(203401);
      204304: test(204304);
      205209: test(205209);
      206116: test(206116);
      207025: test(207025);
      207936: test(207936);
      208849: test(208849);
      209764: test(209764);
      210681: test(210681);
      211600: test(211600);
      212521: test(212521);
      213444: test(213444);
      214369: test(214369);
      215296: test(215296);
      216225: test(216225);
      217156: test(217156);
      218089: test(218089);
      219024: test(219024);
      219961: test(219961);
      220900: test(220900);
      221841: test(221841);
      222784: test(222784);
      223729: test(223729);
      224676: test(224676);
      225625: test(225625);
      226576: test(226576);
      227529: test(227529);
      228484: test(228484);
      229441: test(229441);
      230400: test(230400);
      231361: test(231361);
      232324: test(232324);
      233289: test(233289);
      234256: test(234256);
      235225: test(235225);
      236196: test(236196);
      237169: test(237169);
      238144: test(238144);
      239121: test(239121);
      240100: test(240100);
      241081: test(241081);
      242064: test(242064);
      243049: test(243049);
      244036: test(244036);
      245025: test(245025);
      246016: test(246016);
      247009: test(247009);
      248004: test(248004);
      249001: test(249001);
      250000: test(250000);
      251001: test(251001);
      252004: test(252004);
      253009: test(253009);
      254016: test(254016);
      255025: test(255025);
      256036: test(256036);
      257049: test(257049);
      258064: test(258064);
      259081: test(259081);
      260100: test(260100);
      261121: test(261121);
      262144: test(262144);
      263169: test(263169);
      264196: test(264196);
      265225: test(265225);
      266256: test(266256);
      267289: test(267289);
      268324: test(268324);
      269361: test(269361);
      270400: test(270400);
      271441: test(271441);
      272484: test(272484);
      273529: test(273529);
      274576: test(274576);
      275625: test(275625);
      276676: test(276676);
      277729: test(277729);
      278784: test(278784);
      279841: test(279841);
      280900: test(280900);
      281961: test(281961);
      283024: test(283024);
      284089: test(284089);
      285156: test(285156);
      286225: test(286225);
      287296: test(287296);
      288369: test(288369);
      289444: test(289444);
      290521: test(290521);
      291600: test(291600);
      292681: test(292681);
      293764: test(293764);
      294849: test(294849);
      295936: test(295936);
      297025: test(297025);
      298116: test(298116);
      299209: test(299209);
      300304: test(300304);
      301401: test(301401);
      302500: test(302500);
      303601: test(303601);
      304704: test(304704);
      305809: test(305809);
      306916: test(306916);
      308025: test(308025);
      309136: test(309136);
      310249: test(310249);
      311364: test(311364);
      312481: test(312481);
      313600: test(313600);
      314721: test(314721);
      315844: test(315844);
      316969: test(316969);
      318096: test(318096);
      319225: test(319225);
      320356: test(320356);
      321489: test(321489);
      322624: test(322624);
      323761: test(323761);
      324900: test(324900);
      326041: test(326041);
      327184: test(327184);
      328329: test(328329);
      329476: test(329476);
      330625: test(330625);
      331776: test(331776);
      332929: test(332929);
      334084: test(334084);
      335241: test(335241);
      336400: test(336400);
      337561: test(337561);
      338724: test(338724);
      339889: test(339889);
      341056: test(341056);
      342225: test(342225);
      343396: test(343396);
      344569: test(344569);
      345744: test(345744);
      346921: test(346921);
      348100: test(348100);
      349281: test(349281);
      350464: test(350464);
      351649: test(351649);
      352836: test(352836);
      354025: test(354025);
      355216: test(355216);
      356409: test(356409);
      357604: test(357604);
      358801: test(358801);
      360000: test(360000);
      361201: test(361201);
      362404: test(362404);
      363609: test(363609);
      364816: test(364816);
      366025: test(366025);
      367236: test(367236);
      368449: test(368449);
      369664: test(369664);
      370881: test(370881);
      372100: test(372100);
      373321: test(373321);
      374544: test(374544);
      375769: test(375769);
      376996: test(376996);
      378225: test(378225);
      379456: test(379456);
      380689: test(380689);
      381924: test(381924);
      383161: test(383161);
      384400: test(384400);
      385641: test(385641);
      386884: test(386884);
      388129: test(388129);
      389376: test(389376);
      390625: test(390625);
      391876: test(391876);
      393129: test(393129);
      394384: test(394384);
      395641: test(395641);
      396900: test(396900);
      398161: test(398161);
      399424: test(399424);
      400689: test(400689);
      401956: test(401956);
      403225: test(403225);
      404496: test(404496);
      405769: test(405769);
      407044: test(407044);
      408321: test(408321);
      409600: test(409600);
      410881: test(410881);
      412164: test(412164);
      413449: test(413449);
      414736: test(414736);
      416025: test(416025);
      417316: test(417316);
      418609: test(418609);
      419904: test(419904);
      421201: test(421201);
      422500: test(422500);
      423801: test(423801);
      425104: test(425104);
      426409: test(426409);
      427716: test(427716);
      429025: test(429025);
      430336: test(430336);
      431649: test(431649);
      432964: test(432964);
      434281: test(434281);
      435600: test(435600);
      436921: test(436921);
      438244: test(438244);
      439569: test(439569);
      440896: test(440896);
      442225: test(442225);
      443556: test(443556);
      444889: test(444889);
      446224: test(446224);
      447561: test(447561);
      448900: test(448900);
      450241: test(450241);
      451584: test(451584);
      452929: test(452929);
      454276: test(454276);
      455625: test(455625);
      456976: test(456976);
      458329: test(458329);
      459684: test(459684);
      461041: test(461041);
      462400: test(462400);
      463761: test(463761);
      465124: test(465124);
      466489: test(466489);
      467856: test(467856);
      469225: test(469225);
      470596: test(470596);
      471969: test(471969);
      473344: test(473344);
      474721: test(474721);
      476100: test(476100);
      477481: test(477481);
      478864: test(478864);
      480249: test(480249);
      481636: test(481636);
      483025: test(483025);
      484416: test(484416);
      485809: test(485809);
      487204: test(487204);
      488601: test(488601);
      490000: test(490000);
      491401: test(491401);
      492804: test(492804);
      494209: test(494209);
      495616: test(495616);
      497025: test(497025);
      498436: test(498436);
      499849: test(499849);
      501264: test(501264);
      502681: test(502681);
      504100: test(504100);
      505521: test(505521);
      506944: test(506944);
      508369: test(508369);
      509796: test(509796);
      511225: test(511225);
      512656: test(512656);
      514089: test(514089);
      515524: test(515524);
      516961: test(516961);
      518400: test(518400);
      519841: test(519841);
      521284: test(521284);
      522729: test(522729);
      524176: test(524176);
      525625: test(525625);
      527076: test(527076);
      528529: test(528529);
      529984: test(529984);
      531441: test(531441);
      532900: test(532900);
      534361: test(534361);
      535824: test(535824);
      537289: test(537289);
      538756: test(538756);
      540225: test(540225);
      541696: test(541696);
      543169: test(543169);
      544644: test(544644);
      546121: test(546121);
      547600: test(547600);
      549081: test(549081);
      550564: test(550564);
      552049: test(552049);
      553536: test(553536);
      555025: test(555025);
      556516: test(556516);
      558009: test(558009);
      559504: test(559504);
      561001: test(561001);
      562500: test(562500);
      564001: test(564001);
      565504: test(565504);
      567009: test(567009);
      568516: test(568516);
      570025: test(570025);
      571536: test(571536);
      573049: test(573049);
      574564: test(574564);
      576081: test(576081);
      577600: test(577600);
      579121: test(579121);
      580644: test(580644);
      582169: test(582169);
      583696: test(583696);
      585225: test(585225);
      586756: test(586756);
      588289: test(588289);
      589824: test(589824);
      591361: test(591361);
      592900: test(592900);
      594441: test(594441);
      595984: test(595984);
      597529: test(597529);
      599076: test(599076);
      600625: test(600625);
      602176: test(602176);
      603729: test(603729);
      605284: test(605284);
      606841: test(606841);
      608400: test(608400);
      609961: test(609961);
      611524: test(611524);
      613089: test(613089);
      614656: test(614656);
      616225: test(616225);
      617796: test(617796);
      619369: test(619369);
      620944: test(620944);
      622521: test(622521);
      624100: test(624100);
      625681: test(625681);
      627264: test(627264);
      628849: test(628849);
      630436: test(630436);
      632025: test(632025);
      633616: test(633616);
      635209: test(635209);
      636804: test(636804);
      638401: test(638401);
      640000: test(640000);
      641601: test(641601);
      643204: test(643204);
      644809: test(644809);
      646416: test(646416);
      648025: test(648025);
      649636: test(649636);
      651249: test(651249);
      652864: test(652864);
      654481: test(654481);
      656100: test(656100);
      657721: test(657721);
      659344: test(659344);
      660969: test(660969);
      662596: test(662596);
      664225: test(664225);
      665856: test(665856);
      667489: test(667489);
      669124: test(669124);
      670761: test(670761);
      672400: test(672400);
      674041: test(674041);
      675684: test(675684);
      677329: test(677329);
      678976: test(678976);
      680625: test(680625);
      682276: test(682276);
      683929: test(683929);
      685584: test(685584);
      687241: test(687241);
      688900: test(688900);
      690561: test(690561);
      692224: test(692224);
      693889: test(693889);
      695556: test(695556);
      697225: test(697225);
      698896: test(698896);
      700569: test(700569);
      702244: test(702244);
      703921: test(703921);
      705600: test(705600);
      707281: test(707281);
      708964: test(708964);
      710649: test(710649);
      712336: test(712336);
      714025: test(714025);
      715716: test(715716);
      717409: test(717409);
      719104: test(719104);
      720801: test(720801);
      722500: test(722500);
      724201: test(724201);
      725904: test(725904);
      727609: test(727609);
      729316: test(729316);
      731025: test(731025);
      732736: test(732736);
      734449: test(734449);
      736164: test(736164);
      737881: test(737881);
      739600: test(739600);
      741321: test(741321);
      743044: test(743044);
      744769: test(744769);
      746496: test(746496);
      748225: test(748225);
      749956: test(749956);
      751689: test(751689);
      753424: test(753424);
      755161: test(755161);
      756900: test(756900);
      758641: test(758641);
      760384: test(760384);
      762129: test(762129);
      763876: test(763876);
      765625: test(765625);
      767376: test(767376);
      769129: test(769129);
      770884: test(770884);
      772641: test(772641);
      774400: test(774400);
      776161: test(776161);
      777924: test(777924);
      779689: test(779689);
      781456: test(781456);
      783225: test(783225);
      784996: test(784996);
      786769: test(786769);
      788544: test(788544);
      790321: test(790321);
      792100: test(792100);
      793881: test(793881);
      795664: test(795664);
      797449: test(797449);
      799236: test(799236);
      801025: test(801025);
      802816: test(802816);
      804609: test(804609);
      806404: test(806404);
      808201: test(808201);
      810000: test(810000);
      811801: test(811801);
      813604: test(813604);
      815409: test(815409);
      817216: test(817216);
      819025: test(819025);
      820836: test(820836);
      822649: test(822649);
      824464: test(824464);
      826281: test(826281);
      828100: test(828100);
      829921: test(829921);
      831744: test(831744);
      833569: test(833569);
      835396: test(835396);
      837225: test(837225);
      839056: test(839056);
      840889: test(840889);
      842724: test(842724);
      844561: test(844561);
      846400: test(846400);
      848241: test(848241);
      850084: test(850084);
      851929: test(851929);
      853776: test(853776);
      855625: test(855625);
      857476: test(857476);
      859329: test(859329);
      861184: test(861184);
      863041: test(863041);
      864900: test(864900);
      866761: test(866761);
      868624: test(868624);
      870489: test(870489);
      872356: test(872356);
      874225: test(874225);
      876096: test(876096);
      877969: test(877969);
      879844: test(879844);
      881721: test(881721);
      883600: test(883600);
      885481: test(885481);
      887364: test(887364);
      889249: test(889249);
      891136: test(891136);
      893025: test(893025);
      894916: test(894916);
      896809: test(896809);
      898704: test(898704);
      900601: test(900601);
      902500: test(902500);
      904401: test(904401);
      906304: test(906304);
      908209: test(908209);
      910116: test(910116);
      912025: test(912025);
      913936: test(913936);
      915849: test(915849);
      917764: test(917764);
      919681: test(919681);
      921600: test(921600);
      923521: test(923521);
      925444: test(925444);
      927369: test(927369);
      929296: test(929296);
      931225: test(931225);
      933156: test(933156);
      935089: test(935089);
      937024: test(937024);
      938961: test(938961);
      940900: test(940900);
      942841: test(942841);
      944784: test(944784);
      946729: test(946729);
      948676: test(948676);
      950625: test(950625);
      952576: test(952576);
      954529: test(954529);
      956484: test(956484);
      958441: test(958441);
      960400: test(960400);
      962361: test(962361);
      964324: test(964324);
      966289: test(966289);
      968256: test(968256);
      970225: test(970225);
      972196: test(972196);
      974169: test(974169);
      976144: test(976144);
      978121: test(978121);
      980100: test(980100);
      982081: test(982081);
      984064: test(984064);
      986049: test(986049);
      988036: test(988036);
      990025: test(990025);
      992016: test(992016);
      994009: test(994009);
      996004: test(996004);
      998001: test(998001);
      1000000: test(1000000);
      1002001: test(1002001);
      1004004: test(1004004);
      1006009: test(1006009);
      1008016: test(1008016);
      1010025: test(1010025);
      1012036: test(1012036);
      1014049: test(1014049);
      1016064: test(1016064);
      1018081: test(1018081);
      1020100: test(1020100);
      1022121: test(1022121);
      1024144: test(1024144);
      1026169: test(1026169);
      1028196: test(1028196);
      1030225: test(1030225);
      1032256: test(1032256);
      1034289: test(1034289);
      1036324: test(1036324);
      1038361: test(1038361);
      1040400: test(1040400);
      1042441: test(1042441);
      1044484: test(1044484);
      1046529: test(1046529);
   end;
   str((now-myTime)*10e4:2:3,ts);
   writeln(ts+'sec.');
end.


Добавлено спустя 4 минуты 21 секунду:
>>В чём подвох? Где Zub мухлюет?
подвох в том что тут много промахов. в случае промаха case проебегает все ~1000 значений, а DoIt не находит ключа за максимум 10 итераций. гугли бинарный поиск

Добавлено спустя 7 минут 4 секунды:
убрав промахи и сделав цикл "побольше" чтоб время было заметней
Код: Выделить всё
  for j:=0 to 1000 do
  for i:=0 to 1023 do
    MyCase.DoIt(i*i); 

получаем
E:testcase>E:testcasecase2map.exe
Inserting 0.001sec.
DoIt 0.111sec.

E:testcase>E:testcasestandartcase.exe
0.189sec.

Не так феерично, но тоже потянет

Добавлено спустя 2 минуты 7 секунд:
Кстати да, ведь соврал))

Добавлено спустя 3 минуты 32 секунды:
Исправил, сбил меня этот генератор исходных циферек, поспешишь-людей насмешишь

Добавлено спустя 10 минут 11 секунд:
результаты после компилятора собраного с O2
E:testcase>E:testcasecase2map.exe
Inserting 0.001sec.
DoIt 0.065sec.

E:testcase>E:testcasestandartcase.exe
0.345sec.


Добавлено спустя 33 минуты 32 секунды:
ну и роследний вариант case2map
Код: Выделить всё
program case2map;
uses
  gmap,gutil,sysutils;
type
  TMyKey=Integer;
  TMyOnKeyProc=procedure(key:integer);
  TMyKeyComparer=specialize TLess<TMyKey>;
  TMyCase2Map=class(specialize TMap<TMyKey,TMyOnKeyProc,TMyKeyComparer>)
    procedure doit(key:TMyKey);
  end;
var
  MyCase:TMyCase2Map;
  myTime:TDateTime;
  ts:string;
  i,j:integer;

procedure test(key:integer);
begin
  randseed:=key;
end;

procedure TMyCase2Map.doit(key:TMyKey);
var
  proc:TMyOnKeyProc;
begin
  if TryGetValue(key,proc) then
    proc(key)
end;

begin
  MyCase:=TMyCase2Map.Create;

  myTime:=now;
  for i:=0 to 1023 do
    MyCase.Insert(i*i,@test);
  str((now-myTime)*10e4:2:3,ts);
  writeln('Inserting '+ts+'sec.');

  myTime:=now;
  for i:=0 to 1046529 do
    MyCase.DoIt(i);
  str((now-myTime)*10e4:2:3,ts);
  writeln('DoIt '+ts+'sec.');

  MyCase.Destroy;
end.
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Адрес инструкции

Сообщение Azazaz » 14.03.2017 00:56:40

Еееее, сломал:
Код: Выделить всё
{$mode objfpc}{$H+}
{$inline on}
{$ASMMODE intel}
{$GoTo ON}

procedure Proc;
label l1,l2;
var k: byte;
const
p1: pointer = @l1;
p2: pointer = @l2;
begin
Writeln(DWord(p1), ' ', DWord(p2)); readln;
k:= 0;
asm
  jmp dword p2;
end;
l1: inc(k, 2);
l2: inc(k, 3);
Writeln(k); readln;
end;
begin
Proc;
end.
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: Адрес инструкции

Сообщение zub » 14.03.2017 00:59:46

Будем писать препроцессор? или ручками адреса всех веток вбивать всегда будем))
Тестик будет?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Адрес инструкции

Сообщение runewalsh » 14.03.2017 01:02:20

Усовершенствовал игрушку (строит бенчмарк на основе sequence).
Код: Выделить всё
{$mode objfpc}
var
   sequence: array of cardinal;
   iterations, itMul, itMod: cardinal;
   i: SizeInt;
begin
   SetLength(sequence, 1024);
   for i := 0 to High(sequence) do
      sequence[i] := i*i;

   if length(sequence) < 2 then
   begin
      writeln('Too short sequence(', length(sequence), ').');
      exit;
   end;
   iterations := 40000000;
   itMul := sequence[1];
   itMod := sequence[High(sequence)] + sequence[1];

   writeln('{$mode objfpc} {$typedaddress on} {$coperators on} {$rangechecks off} {$overflowchecks off}');
   writeln('uses');
   writeln('   SysUtils, DateUtils, GMap, GUtil;');
   writeln;
   writeln('   procedure DoCase(key: integer; var value: cardinal);');
   writeln('   begin');
   writeln('      case key of');
   for i := 0 to High(sequence) do
      writeln('         ', sequence[i], ': value += ', 1+i, ';');
   writeln('         else value += ', High(sequence) + 2, ';');
   writeln('      end;');
   writeln('   end;');
   writeln;
   writeln('type');
   writeln('   BranchBody = procedure(var value: cardinal);');
   writeln('   BranchMapComparer = specialize TLess<integer>;');
   writeln('   BranchMap = class(specialize TMap<integer, BranchBody, BranchMapComparer>)');
   writeln('      constructor Create;');
   writeln('      procedure DoIt(key: integer; var value: cardinal);');
   writeln('   end;');
   writeln;
   for i := 0 to High(sequence) do
      writeln('   procedure Case', sequence[i], '(var value: cardinal); begin value += ', 1+i, '; end;');
   writeln;
   writeln('   constructor BranchMap.Create;');
   writeln('   begin');
   writeln('      inherited;');
   for i := 0 to High(sequence) do
      writeln('      Insert(', sequence[i], ', @Case', sequence[i], ');');
   writeln('   end;');
   writeln;
   writeln('   procedure BranchMap.DoIt(key: integer; var value: cardinal);');
   writeln('   var');
   writeln('      body: BranchBody;');
   writeln('   begin');
   writeln('      if TryGetValue(key, body) then');
   writeln('         body(value)');
   writeln('      else');
   writeln('         value += ', High(sequence) + 2, ';');
   writeln('   end;');
   writeln;
   writeln('   procedure Run;');
   writeln('   const');
   writeln('      Iterations = ', iterations, ';');
   writeln('   var');
   writeln('      start: TDateTime;');
   writeln('      tcase, tmap: double;');
   writeln('      i, sum, refSum: cardinal;');
   writeln('      dispatch: BranchMap;');
   writeln('   begin');
   writeln('      start := Now;');
   writeln('      sum := 0;');
   writeln('      for i := 1 to Iterations do');
   writeln('         DoCase(', itMul, '*i mod ', itMod, ', sum);');
   writeln('      tcase := SecondSpan(Now, start);');
   writeln('      writeln(''Case: '', tcase:0:2, '' s ('', tcase/Iterations*1e9:0:2, '' ns/iter), '', sum);');
   writeln('      refSum := sum;');
   writeln;
   writeln('      dispatch := BranchMap.Create;');
   writeln('      try');
   writeln('         start := Now;');
   writeln('         sum := 0;');
   writeln('         for i := 1 to Iterations do');
   writeln('            dispatch.DoIt(', itMul, '*i mod ', itMod, ', sum);');
   writeln;
   writeln('         if sum <> refSum then');
   writeln('         begin');
   writeln('            writeln(''Something went wrong! (sum = '', sum, '', refSum = '', refSum, '')'');');
   writeln('            exit');
   writeln('         end;');
   writeln;
   writeln('         tmap := SecondSpan(Now, start);');
   writeln('         writeln(''TMap: '', tmap:0:2, '' s ('', tmap/Iterations*1e9:0:2, '' ns/iter), '', sum);');
   writeln('      finally');
   writeln('         dispatch.Free;');
   writeln('      end;');
   writeln;
   writeln('      if (tcase > 0.1) and (tmap > 0.1) then');
   writeln('         if tcase > 1.01*tmap then writeln(''Map faster by factor of '', tcase / tmap:0:2, ''x.'')');
   writeln('         else if tmap > 1.01*tcase then writeln(''Case faster by factor of '', tmap / tcase:0:2, ''x.'')');
   writeln('         else writeln(''Cannot conclude anything useful.'');');
   writeln('   end;');
   writeln;
   writeln('begin');
   writeln('   Run;');
   writeln('   readln;');
   writeln('end.');
end.

Последовательный case (от 0 до N):
Код: Выделить всё
Case: 0.77 s (19.35 ns/iter)
TMap: 6.41 s (160.30 ns/iter)
Case faster by factor of 8.28x.

Непоследовательный case (квадратичная последовательность, как у вас):
Код: Выделить всё
Case: 20.35 s (508.80 ns/iter)
TMap: 4.94 s (123.45 ns/iter)
Map faster by factor of 4.12x.

В таком случае склоняюсь к тому, чтобы, если уж сильно важно, на основе значений кейса самому генерировать паскалевский код с деревом сравнений (и, возможно, маленькими подкейсами по последовательностям — с кодовыми точками именно такой случай).
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Адрес инструкции

Сообщение Azazaz » 14.03.2017 01:10:12

Я сломал его полностью:
Код: Выделить всё
{$mode objfpc}{$H+}
{$inline on}
{$ASMMODE intel}
{$GoTo ON}

procedure Proc;
label l1,l2;
var k: byte;
type
TOffs = array[0..1]of pointer;
const
O: TOffs = (@l1, @l2);
begin
k:= 0;
asm
  add [O], 4;
  jmp O;
end;
l1: inc(k, 2);
l2: inc(k, 3);
Writeln(k); readln;
end;
begin
Proc;
end.

Теперь есть массив, и опциональный скачок
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: Адрес инструкции

Сообщение скалогрыз » 14.03.2017 01:12:47

А вот тут ещё! та же тема рассматривалась
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Адрес инструкции

Сообщение zub » 14.03.2017 01:25:49

>>Последовательный case (от 0 до N):
Где ключи выдаются самостоятельно и гарантирована их последовательность - ессно за основу лучше взять tvector.
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Адрес инструкции

Сообщение Azazaz » 14.03.2017 01:32:04

Из темы от скалогрыз:
http://forum.lazarus.freepascal.org/index.php/topic,34614.msg227667.html#msg227667
Таблица с результатом тестов:
inline macro asm: Time: 10334 Sum: 46130000
inline GotoAddr call: Time: 8901 Sum: 46130000
case: Time: 11211 Sum: 46130000
case with table: Time: 11287 Sum: 46130000
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: Адрес инструкции

Сообщение zub » 14.03.2017 01:37:12

>>Таблица с результатом тестов:
глядя на эту табличку - нестоит вообще замарачиваться - результаты считай одинаковые
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Адрес инструкции

Сообщение runewalsh » 14.03.2017 01:51:27

Можно ещё в map не заносить указатели, а использовать для «выравнивания» кейса. Т. е.
Код: Выделить всё
case key of
   1: DoA;
   2: DoB;
   5: DoC;
   10: DoD;
   100: DoE;
   else DoF;
end;

Код: Выделить всё
{Init:} Insert(1, 0); Insert(2, 1); Insert(5, 2); Insert(10, 3); Insert(100, 4);
{DoIt:}
if not TryGetValue(key, index) then index := 5;
case index of
   0 {1}: DoA;
   1 {2}: DoB;
   2 {5}: DoC;
   3 {10}: DoD;
   4 {100}: DoE;
   else DoF;
end;
Удобнее (практически просто надстройка над case), скорость та же.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Адрес инструкции

Сообщение vitaly_l » 14.03.2017 11:15:25

Azazaz писал(а):Я сломал его полностью:

Описание add
Код: Выделить всё
Опкод add имеет следующий синтаксис:

add приемник, источник
Выполняет вычисление: приемник = приемник + источник.

Имеются также другие формы:

приемник   источник   пример
регистр   регистр   add ecx, edx
регистр   память   add ecx, dword ptr [104h] / add ecx, [edx]
регистр   значение   add eax, 102
память   значение   add dword ptr [401231h], 80
память   регистр   add dword ptr [401231h], edx
Эта команда очень проста. Она добавляет значение источника к значению приемника и помещает результат в приемник.


Ваш код:
Код: Выделить всё
O: TOffs = (@l1, @l2);
begin
asm
  add [O], 4;
  jmp O;
end;

Не знаю как Вы сломали его, но мой мозг точно сломался, т.к. непонятно:
1) Как вам удаётся прибавить к O + 4 ( add [O], 4; ), если O это const O: TOffs = (@l1, @l2); ???
2) куда именно делается jmp O; если O это const O: TOffs = (@l1, @l2); ???
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Адрес инструкции

Сообщение serbod » 14.03.2017 11:29:22

Реализация условного перехода при помощи арифметики? Странное развлечение для 2017 года, обычно такими вещами в геймдеве времен 20-битной адресации страдали. FreePascal не самый подходящий инструмент для этого, поскольку он заточен на кросс-платформенность, а не на качество машинного кода.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

Рейтинг@Mail.ru