Article View: pl.comp.lang.java
Article #141789Re: Szybkość Javy wg Horstmanna a testy...
From: jarekr
Date: Mon, 20 Oct 2008 13:17
Date: Mon, 20 Oct 2008 13:17
210 lines
6729 bytes
6729 bytes
On 19 Paź, 21:41, Abece <abece.inac...@abece.pl> wrote:
> Uparłem się i wklepałem kod z VIII wydania "Java podstawy".
>
> I niestety, uzyskane wyniki, są... dziwne. Wedle książki, na ThinkPadzie
> 2 rdzeniowym, 1.66 GHz: 360/105ms (C++/Java).
>
> U mnie - dałem szansę Javie (1.6_10) i odpalałem ją na PDC 2...@2.53 GHz
> + 3.5 GB RAM a C++ (GCC 4.1.1 Gentoo) na Duronie 1.2 GHz + 256 MB RAMu z
> wynikami odpowiednio:
> Java:
>
> T:\testszybkosci>java exp
> Ilosc: 2
> 21688 ms.
> T:\testszybkosci>java exp
> Ilosc: 2
> 21984 ms.
> T:\testszybkosci>java exp
> Ilosc: 2
> 22016 ms.
> T:\testszybkosci>java exp
> Ilosc: 2
> 22125 ms.
>
> C++ (Duron 1.2GHz)
> $ ./a.out
> Ilosc: 2
> 630 ms.
> $ ./a.out
> Ilosc: 2
> 630 ms.
> $ ./a.out
> Ilosc: 2
> 630 ms.
> $ ./a.out
> Ilosc: 2
> 630 ms.
>
> Poniżej załączam oba kody z ww książki...
> Spodziewałem się wyniku bliżej 50-80ms (MAX!), ale nie 22 sekundy(sic!).
>
> Przyznam się szczerze, że nawet ja (jestem baaaardzo sceptyczny wobec
> osiągów Javy) jestem zdumiony wynikiem uzyskanym w teście zaproponowanym
> przez Znawcę - Pana Horstmanna...
>
> =============== KODY =================
>
> JAVA:
> "
> import java.util.*;
>
> public class exp
> {
> public static void main(String[] s)
> {
> int n=2000000;
> long start = System.currentTimeMillis();
> 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++;
> int k=2*i;
> while(k<=n)
> {
> b.clear(k);
> k = k + 1;
> }
> i++;
> }
> while (i<=n)
> {
> if(b.get(i)) count++;
> i++;
> }
> long end = System.currentTimeMillis();
> System.out.println("Ilosc: " + count);
> System.out.println((end - start) + " ms.");
>
> }
>
> }
>
> C++:
> "
> #include <bitset>
> #include <iostream>
> #include <ctime>
>
> using namespace std;
>
> int main() {
> const int n=2000000;
> clock_t cstart = clock();
> bitset<n+1> b;
> int count = 0;
> int i;
>
> for (i=2;i<=n;i++)
> {
> b.set(i);
> }
> i = 2;
> while (i*i<=n)
> {
> if (b.test(i))
> {
> count++;
> int k=2*i;
> while (k<=n)
> {
> b.reset(k);
> k = k+ 1;
> }
> }
> i++;
> }
> while (i<=n)
> {
> if (b.test(i))
> {
> count++;
> }
> i++;
> }
> clock_t cend = clock();
> double millis = 1000.0 * (cend - cstart) / CLOCKS_PER_SEC;
> cout << "Ilosc: " << count << endl << millis << " ms.";
> return 0;
>
> }
>
> "
Spędziłem nad tym troche czasu, bo nie mogłem zrozumiec - jak program
skompilowany GCC (u mnie) może być szybszy od javowego (na JVM).
I odkryłem. Bo to nie jest ten sam program ;-) - stąd różnice.
Ten program to miało być sito erastotenesa - i w C++ jest. w javie
niestety nie - zabrakło Ci kluczowej klamry:
oto wersja poprawiona oraz z doczepioną rozgrzewką JVM:
public class TestCode4
{
public static void main(String[] s)
{
int n = 1000000;
for (int i = 0 ; i < 1000; i++)
{
doOnlyWarmUp(100);
}
doItForMe(n);
}
private static void doItForMe(int n)
{
long start = System.currentTimeMillis();
int count = doOnlyWarmUp(n);
long end = System.currentTimeMillis();
System.out.println("Ilosc: " + count);
System.out.println((end - start) + " ms.");
}
private static int doOnlyWarmUp(int n)
{
BitSet b = new BitSet(n);
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++;
int k = 2 * i;
while (k <= n)
{
b.clear(k);
k += i;
}
}
i++;
}
while (i <= n)
{
if (b.get(i))
{
count++;
}
i++;
}
return count;
}
}
Wynik u mnie 47ms
przy opcjach JVM ->-server -da -dsa -Xms512m -Xmx512m -
XX:CompileThreshold=20 -Xverify:none -Xnoclassgc -XX:+AggressiveOpts -
XX:+UseFastAccessorMethods -XX:+UseBiasedLocking
(oczywiście pare z tego niepotrzebnych do tego programu -ale to moje
defaultowe)
Technical Details
Message-ID:
<df635ef9-4a3f-4915-be18-d2dcf7f09b9f@t18g2000prt.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!t18g2000prt.googlegroups.com!not-for-mailReferences:
<gdg318$g5g$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!t18g2000prt.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 06:17:12 -0700 (PDT) Organization: http://groups.google.com Lines: 219 Message-ID: <df635ef9-4a3f-4915-be18-d2dcf7f09b9f@t18g2000prt.googlegroups.com> References: <gdg318$g5g$1@nemesis.news.neostrada.pl> NNTP-Posting-Host: 194.8.14.8 Mime-Version: 1.0 X-Trace: posting.google.com 1224508632 29723 127.0.0.1 (20 Oct 2008 13:17:12 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Mon, 20 Oct 2008 13:17:12 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: t18g2000prt.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