Article View: pl.comp.lang.java
Article #141783Re: Szybkość Javy wg Horstmanna a testy...
From: jarekr
Date: Mon, 20 Oct 2008 07:38
Date: Mon, 20 Oct 2008 07:38
209 lines
6010 bytes
6010 bytes
On 20 Paź, 07:40, Abece <abece.inac...@abece.pl> wrote:
> Marcin Mielżyński pisze:
>
> > 1) użyj kompilatora c2 (opcja -server)
>
> Bez tej opcji, na Duronie 1.2 GHz: (ten, na którym C++ osiągnął 630ms)
> Ilosc: 2
> 40526 ms.
>
> real 0m40.682s
> user 0m40.548s
> sys 0m0.099s
>
> Z tą opcją:
>
> Ilosc: 2
> 43405 ms.
>
> real 0m44.395s
> user 0m42.359s
> sys 0m1.208s
>
> Ilosc: 2
> 43408 ms.
>
> real 0m43.580s
> user 0m43.201s
> sys 0m0.355s
>
> Ilosc: 2
> 43117 ms.
>
> real 0m43.289s
> user 0m41.896s
> sys 0m1.351s
>
> Ilosc: 2
> 43458 ms.
>
> real 0m43.645s
> user 0m42.316s
> sys 0m1.218s
>
> ^ jak widać, parametr raczej zwiększył czas wykonywania testu - niż go
> skrócił... :]
>
> > 2) daj pętle do osobnych metod bo to jest klasyczny błąd pisania w javie
>
> [...ciach]
>
> Nie ja pisałem kod, ale pan Horstmann - specjalista od javy :-)
> Ja tu robię tylko za testera/wklepywacza kodu ;-)
Specjalista - Srecjalista.
1. Nie ma testów javy bez opcji kompilatora (Hotspot) - weźmy moje:
-server -Xms256m -Xmx256m -XX:CompileThreshold=100 -Xverify:none -
Xnoclassgc -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:
+UseBiasedLocking
2. Przepiszmy kod nieco inaczej - tak żeby kompilator JVM się nie
wykładał na nim ( dla uproszczenia - z kilku powodów wykłada się jak
masz wszystko w main)
(generalnie opcja extract method w Eclipse + kluczowa sprawda czyli
rozgrzewka kompilatora :
for (int i = 0 ; i < 1000; i++)
{
method(100);
}
// nie liczymy tu nic - wyniki gubimy ale dajemy szanse kompilatorowi
javy aby połapał się co warto skompilować w tym kodzie i jak
agresywnie
)
// begin code
public class TestCode3
{
public static void main(String[] s)
{
final int n=2000000;
for (int i = 0 ; i < 1000; i++)
{
method(100);
}
mainTest(n);
}
private static void mainTest(final int n)
{
final long start = System.currentTimeMillis();
int count = method(n);
final long end = System.currentTimeMillis();
System.out.println("Ilosc: " + count);
System.out.println((end - start) + " ms.");
}
private static int method(final int n)
{
final BitSet b = new BitSet(n+1);
int count = 0;
int i;
for(i=2;i<=n;i++)
b.set(i);
i=2;
while (i*i<=n)
{
if(b.get(i))
count++;
inner1(n, b, i);
i++;
}
while (i<=n)
{
if(b.get(i)) count++;
i++;
}
return count;
}
private static void inner1(final int n, final BitSet b, int i)
{
int k=2*i;
while(k<=n)
{
b.clear(k);
k = k + 1;
}
}
}
// end code
sprawdź jak to Ci bangla - u mnie z 22 sekund zrobiło się 6s
I tu dochodzimy do ściany (IMO) - bo BitSet javowy jest napisany
bardzo tak sobie - z pewności szybkośc nie jest jego mocna stroną
(choćby patrząc na ilość assertów w kodzie).
więc zmieńmy go na tablice bajtów.
public class TestCode2
{
public static void main(String[] s)
{
final int n=2000000;
for (int i = 0 ; i < 1000; i++)
{
method(100);
}
mainTest(n);
}
private static void mainTest(final int n)
{
final long start = System.currentTimeMillis();
int count = method(n);
final long end = System.currentTimeMillis();
System.out.println("Ilosc: " + count);
System.out.println((end - start) + " ms.");
}
private static int method(final int n)
{
final boolean[] b = new boolean[n+1];
int count = 0;
int i;
for(i=2;i<=n;i++)
b[i] = true;
i=2;
while (i*i<=n)
{
if(b [i])
count++;
inner1(n, b, i);
i++;
}
while (i<=n)
{
if(b[i]) count++;
i++;
}
return count;
}
private static void inner1(final int n, final boolean[] b, final int
i)
{
int k=2*i;
while(k<=n)
{
b[k] = false;
k = k + 1;
}
}
}
--
u mnie wynik ok 407 ms
Pewnie jeszcze się da poprawić.
Pozostaje pytanie czy jest gdzieś Szybki Bitset do javy. Dobry bitset
powinien mieć prędkość zbliżoną do tablicy boolean.
(BTW. IMHO prawdopodobnie bez dopisania natywnych wraperów do JVM na
BitSet (nie chodzi mi o JNI) - to może się nie udać)
--
pozdrawiam
jarekr
Technical Details
Message-ID:
<1b6e56f8-4661-4c37-847f-d7f7e8b170a8@u75g2000hsf.googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!u75g2000hsf.googlegroups.com!not-for-mailReferences:
<gdg318$g5g$1@nemesis.news.neostrada.pl> <gdgdde$e7d$1@news.onet.pl> <gdh63q$t2g$1@nemesis.news.neostrada.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!u75g2000hsf.googlegroups.com!not-for-mail From: jarekr <jratajski@gmail.com> Newsgroups: pl.comp.lang.java Subject: Re: Szybkość Javy wg Horstmanna a testy... Date: Mon, 20 Oct 2008 00:38:06 -0700 (PDT) Organization: http://groups.google.com Lines: 213 Message-ID: <1b6e56f8-4661-4c37-847f-d7f7e8b170a8@u75g2000hsf.googlegroups.com> References: <gdg318$g5g$1@nemesis.news.neostrada.pl> <gdgdde$e7d$1@news.onet.pl> <gdh63q$t2g$1@nemesis.news.neostrada.pl> NNTP-Posting-Host: 194.8.14.8 Mime-Version: 1.0 X-Trace: posting.google.com 1224488286 15918 127.0.0.1 (20 Oct 2008 07:38:06 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Mon, 20 Oct 2008 07:38:06 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: u75g2000hsf.googlegroups.com; posting-host=194.8.14.8; posting-account=8VcG5goAAAABOIouhSJEZq2WqNug-5DI User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3 (.NET CLR 3.5.30729),gzip(gfe),gzip(gfe) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit