Delphi.cz

Český portál Delphi

Optimalizační soutěž č.3

Pro zájemce třetí kolo soutěže. Úkolem je optimalizovat demo funkci, pravidla se od minule v podstatě nemění. Nejlepší (tj. nejrychlejší) vyhraje tričko s logem FireMonkey, flašku 4GB a případně 2x hrníček s logem Borland (viz minule, fakt se z něj dobře pije). Případně může být udělena i druhá cena (za nejzajímavější kód nebo nejrychlejší řešení bez ASM).

Uzávěrka je 21.3.2012 ve 20 hodin, ale řešení se může posílat průběžně (každý může poslat 3 řešení), ale nejdříve 1.3 - chtěl bych si zkusit ještě trošku poladit svoje řešení.

Pravidla

  • je možno použít libovolný kompilátor pascalu (Delphi 2 - Delphi XE2, FreePascal)
  • z povahy řešení není povoleno používat vlákna
  • testované budou výsledné Vámi přeložené aplikace, zdrojový kód je jen pro kontrolu vítězů
  • průběžně budou zveřejňovány přeložené aplikace, zaslané zdrojové kódy budou zveřejněny nakonec
  • výsledné pořadí bude určeno během na mém Core i3 @ 2.1G (Thinkpad T520i) na Windows 7 64bit
  • v případě stejných výsledků rozhoduje zajímavější řešení, rozhodne porota ve složení Já, Já a Já
  • můžu se tím pádem zúčastnit i já (bez nároku na výhru - doufám, že skončím aspoň v první polovině pole)
  • co se bude dít ve Vaší proceduře je jedno, jen se nesmí nijak cacheovat výsledky předchozích běhu, manipulovat s měřením atd.
  • Při každém vyvolání musí být výsledky vypočítány samostatně bez návaznosti na předchozí nebo následující výpočty. Výpočty z různých vyvolání nemohou běžet paralelně. Opakované vyvolání je jen pro zpřesnění měření a program se musí chovat stejně i při pouhém jednom opakovaní. Bere se minimum.
  • lze poslat max. 3 řešení
  • není povoleno manipulování s měřením času (jako přeprogramování časovače, patchnutí volání API funkce atd.)
  • program dávající špatné výsledky je vyřazen
  • na výhru není právní nárok :-)
  • je to pro zábavu, z principu je určitá tolerance měření

Doufám, že to bude zábava.

Zadání

Napište co nejrychlejší variantu

procedure IntToStrExFmt(i:Integer; var s:string);
var
  cr: Currency;
begin
  cr := i;
  FmtStr(s, '%.0n', [cr]);
end;

Funkce tedy vrací text, který obsahuje převedenou hodnotu čísla, ale bere v potaz oddělovač tisíců (+ znaménko). Program na konci provádí několik volání pro testovací výpis - výsledek se vypisuje včetně velikosti řetězce a musí se rovnat demo výstupu.

V programu upravte svoje jméno, případně podmíněnou kompilaci.

Ukázka výsledku:

-123 456 789
-2 147 483 647
2 147 483 647
123 456

Běh programu:

q:\soutez3>soutez.exe
ThousandSeparator:160
Autor: Radek Červinka,  kompilator:23,00
Last time = [18787]
Min time = [18787], Average time = [18818], Max time = [18845]
Kontrola:
-123 456 789, 12
-2 147 483 647, 14
2 147 483 647, 13
123 456, 7
-1, 2
0, 1

soutez3.zip - demo program.

Poznámky

Osobně jsem použil Delphi XE2, demo se provádí cca 19s. Vybral jsem záměrně takový příklad, který má velký potenciál pro optimalizaci a může si ho zkusit různě zkušený programátor. Délku provádění jsem odhadl podle mé soukromé verze soutěžního řešení s tím, že určitě nebudu nejrychlejší - tak ať je rezerva.

Pro antivirový test můžete použít virusscan.jotti.org.

V případě nejasností napište komentář.

A ještě jednou: je to pro zábavu.

Datum: 2012-02-24 22:59:00 Tagy: optimalizace

soutez