🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#141789
From: jarekr
Date: Mon, 20 Oct 2008 13:17
210 lines
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-mail
References: <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