🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.java
Article #141783

Re: Szybkość Javy wg Horstmanna a testy...

#141783
From: jarekr
Date: Mon, 20 Oct 2008 07:38
209 lines
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-mail
References: <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