Autor Zpráva
mark92
Profil
Zdravím. Robím v Jave a naprogramoval som metódu, ktorá v sebe obsahuje veľké množstvo kódu (600 riadkov, 40 kb zdrojového kódu, 12 kb bitového). Rýchlosť spracovania funkcie je cca 20000x/s. Keď pridám na koniec funkcie pár nezávislých príkazov neovplivňujúce činnosť algoritmu:
int qqq = 10; qqq *= 12; qqq *= 14;

rýchlosť padne na 1500x/s, čo neni ani 10% pôvodnej.
Pracujem v NetBeans IDE 6.7.1, no chybou vývojového prostredia to nieje, urobil som 2 nezávislé pokusy na 2 rôznych kompilátoroch a oba dopadli rovnako. Kód metódy sa nedá zmenšiť a potrebujem, aby nebola jej rýchlosť redukovaná.
Nevie poradiť, prečo rýchlosť spracovania metódy padne na zlomok pôvodnej po prekročení určitého limitu príkazov? Vďaka.
TomášK
Profil
Tohle není zrovna vhodné fórum, kde se ptát na takový dotaz - zkus najít nějaké fórum o Javě. Pokud je to opravdu jen tenhle řádek, očekával bych, že kompilátor zjistí, že je zbytečný a ve výsledné binárce vůbec nebude. Je nastavená vhodná optimalizace kompilátoru? Pokud kompilátor ten kód neodstraní, násobení je poměrně drahá instrukce, musí se zapisovat do paměti. Je možné, že se pak něco někde nevejde do cache, nebo kompilátor přestane inlinovat...těžko říct z dostupných informací.
mark92
Profil
Príkaz s elementárnym násobením dokáže Java spracovať minimálne pol miliardy krát za sekundu a v metóde sa vyskytuje pomerne často. Uvedené 3 príkazy by nemali rýchlosť akokoľvek ovplivniť.
Urobil som na to nezávislý test. Metódu:
public void metoda(){int r = 0; r++; r++; r++; /*príkaz r++; som tam hodil 2665 krát*/}

som odstopoval. Funkcia prebehla 100 000 000x/s (kompilátor zrejme zistil, že príkazy sú zbytočné). No s 2666 prehebla len 65 000x/s. Čo je 0,5% pôvodnej rýchlosti. Jeden príkaz r++; naviac predsa nemôže funkciu spomaliť 200 násobne. Nerozumiem tomu.
TomášK
Profil
mark92:
Máš pravdu, násobení je poměrně rychlé, dělení je významně pomalejší než ostatní instrukce. Pořád platí výše uvedené, zkontroluj optimalizace kompilátoru a zkus to raději jinde. Tohle je typické chování, když se něco nevejde do cache (je i cache na instrukce) a program musí sáhnout do cache vyšší úrovně nebo do paměti.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0