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.