-
1. Data: 2009-08-02 11:05:44
Temat: int 32, int 64, java
Od: mgk <m...@w...pl>
Przepraszam jesli wiadomość zamieszczam w złym miejscu lub robię coś
nie tak. Dawno już nie korzystalem z grupy dyskusyjnej.
Napisałem prosty test (kod poniżej) wykonujący po prostu miliard
mnożeń liczby 32bitowej, oraz miliard mnożeń liczby 64bitowej. Czas
obu operacji jest mierzony i wyświetlany. Testowałem go w środowisku
32 oraz 64bit (oczywiście w środowisku 64bit była java 64bit).
Testowałem na Linuxie oraz WIndowsie (czyli 4 testu w sumie Linux 32 i
64bit, Windows 32 i 64 bit).
Wyniki jakie dostałem dla linuxa 32bit sa zastanawiające, ale po
kolej.
Pod Windows 32bit wynik:
time32: 1753 time64: 4880
Pod Windows 64bit (i java 64) wynik:
time32: 432 time64: 446
Czyli jak mozna sie bylo spodziewac czas operacji w srodowisku 64bit
jest praktycznie rowny. Chociaz dziwi troche ze czas wykonania
operacji 32bitowej jest 3 razy szybszy...
Ale teraz jeszcze ciekawsze. Wynik na Linuxie 32 bit (który jest
prawie identyczny z linuxem 64bit):
time32: 426 time64: 569
Nie pomyliłem się. Do napisania tego testu zainspirowały mnie wyniki
wydajności innego mojego programu (silnika szachowego) w którym jest
identyczna zależność (wydajność w windows 32bit jest dużo slabsza niz
na linux 32, 64 czy windows 64. I to nawet jak nie używam long-ow).
Nie rozumiem dlaczego wyniki na Linuxie 32bit są tak dobre jak na
Linux 64bit, czy Widnows 64 bit. Albo inaczej. Dlaczego w takim razie
na Windows 32bit są tak słabe?
Czy Linux 32bit potrafi jakoś wykorzystać 64bitowe rejestry?
Czy to w Windows 32bit coś jest "zwalone"? A może w implementacji javy
32bit pod windows jest problem? No bo gdyby tylko o rejestry chodziło
to czemu mnożenie 32bitowych wartości wypada i tak 3 razy wolniej pod
windows 32bit niż w pozostałych.
A oto kod (tak wiem, ze jest brzydki. To tylko program testujacy):
int k = 5;
long time = System.currentTimeMillis();
for (int i = 0; i < N; ++i)
{
k = k * 13 + 12345;
}
time = System.currentTimeMillis() - time;
long l = 5;
long time2 = System.currentTimeMillis();
for (int i = 0; i < N; ++i)
{
l = l * 13 + 12345;
}
time2 = System.currentTimeMillis() - time2;
System.out.println("k: " + k + " l: " + l);
System.out.println("time32: " + time + " time64: " + time2);
-
2. Data: 2009-08-02 12:15:02
Temat: Re: int 32, int 64, java
Od: mgk <m...@w...pl>
Chcialem tylko jeszcze dodac ze test to byl program w Javie.
W Javie long jest zawsze 64bit.
-
3. Data: 2009-08-02 13:04:38
Temat: Re: int 32, int 64, java
Od: A.L. <a...@a...com>
On Sun, 2 Aug 2009 05:15:02 -0700 (PDT), mgk <m...@w...pl> wrote:
>Chcialem tylko jeszcze dodac ze test to byl program w Javie.
>
A jak mierzyles ten czas?...
A.L.
-
4. Data: 2009-08-02 13:28:51
Temat: Re: int 32, int 64, java
Od: "Mariusz Marszałkowski" <b...@N...gazeta.pl>
mgk <m...@w...pl> napisał(a):
> Czyli jak mozna sie bylo spodziewac czas operacji w srodowisku 64bit
No właśnie, zrób lepszy pomiar czasu. Zmierz czas pracy procesora, a nie
czas który upłynął od startu do zakończenia. Pod linuxem jest spacjalna
komenda, chyba "times". Pod windowsem nie umiem nic doradzić.
> Do napisania tego testu zainspirowa=B3y mnie wyniki wydajno=B6ci innego
> mojego programu (silnika szachowego) w kt=F3rym jest
Może to przypadkiem silnik "Nesik" o którym rozmawialiśmy ostatnio na
progszach?
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
5. Data: 2009-08-02 13:47:55
Temat: Re: int 32, int 64, java
Od: A.L. <a...@a...com>
On Sun, 2 Aug 2009 13:28:51 +0000 (UTC), "Mariusz Marszałkowski"
<b...@N...gazeta.pl> wrote:
>mgk <m...@w...pl> napisał(a):
>
>> Czyli jak mozna sie bylo spodziewac czas operacji w srodowisku 64bit
>
>No właśnie, zrób lepszy pomiar czasu. Zmierz czas pracy procesora, a nie
>czas który upłynął od startu do zakończenia. Pod linuxem jest spacjalna
>komenda, chyba "times". Pod windowsem nie umiem nic doradzić.
Lava ma metode System.nanoTime() podajaca czas z rozdzielczoscai
nanosekundowa. Wszystkie inne sposoby licznie czasu sa funta klakow
niewarte
A.L.
-
6. Data: 2009-08-02 14:10:52
Temat: Re: int 32, int 64, java
Od: A.L. <a...@a...com>
On Sun, 02 Aug 2009 08:47:55 -0500, A.L. <a...@a...com> wrote:
>On Sun, 2 Aug 2009 13:28:51 +0000 (UTC), "Mariusz Marszałkowski"
><b...@N...gazeta.pl> wrote:
>
>>mgk <m...@w...pl> napisał(a):
>>
>>> Czyli jak mozna sie bylo spodziewac czas operacji w srodowisku 64bit
>>
>>No właśnie, zrób lepszy pomiar czasu. Zmierz czas pracy procesora, a nie
>>czas który upłynął od startu do zakończenia. Pod linuxem jest spacjalna
>>komenda, chyba "times". Pod windowsem nie umiem nic doradzić.
>
>Lava ma metode
Java
A.L.
-
7. Data: 2009-08-02 14:13:17
Temat: Re: int 32, int 64, java
Od: Mateusz Loskot <s...@s...net>
A.L. wrote:
> On Sun, 2 Aug 2009 13:28:51 +0000 (UTC), "Mariusz Marszałkowski"
> <b...@N...gazeta.pl> wrote:
>
>> mgk <m...@w...pl> napisał(a):
>>
>>> Czyli jak mozna sie bylo spodziewac czas operacji w srodowisku 64bit
>> No właśnie, zrób lepszy pomiar czasu. Zmierz czas pracy procesora, a nie
>> czas który upłynął od startu do zakończenia. Pod linuxem jest spacjalna
>> komenda, chyba "times". Pod windowsem nie umiem nic doradzić.
>
> Lava ma metode System.nanoTime() podajaca czas z rozdzielczoscai
> nanosekundowa.
O ile implementacja nanoTime() bazuje na odpowiednim API systemowym.
Sun pisze [1]
System.nanoTime() is implemented using the
QueryPerformanceCounter/QueryPerformanceFrequency API (if available,
else it returns currentTimeMillis*10^6
[1] http://blogs.sun.com/dholmes/entry/inside_the_hotspo
t_vm_clocks
Pozdrawiam
--
Mateusz Loskot, http://mateusz.loskot.net
Charter Member of OSGeo, http://osgeo.org
-
8. Data: 2009-08-02 14:50:46
Temat: Re: int 32, int 64, java
Od: A.L. <a...@a...com>
On Sun, 02 Aug 2009 15:13:17 +0100, Mateusz Loskot
<s...@s...net> wrote:
>A.L. wrote:
>> On Sun, 2 Aug 2009 13:28:51 +0000 (UTC), "Mariusz Marszałkowski"
>> <b...@N...gazeta.pl> wrote:
>>
>>> mgk <m...@w...pl> napisał(a):
>>>
>>>> Czyli jak mozna sie bylo spodziewac czas operacji w srodowisku 64bit
>>> No właśnie, zrób lepszy pomiar czasu. Zmierz czas pracy procesora, a nie
>>> czas który upłynął od startu do zakończenia. Pod linuxem jest spacjalna
>>> komenda, chyba "times". Pod windowsem nie umiem nic doradzić.
>>
>> Lava ma metode System.nanoTime() podajaca czas z rozdzielczoscai
>> nanosekundowa.
>
>O ile implementacja nanoTime() bazuje na odpowiednim API systemowym.
O ile znam Linuksa, to Linuks na pewno w takie duperele sie nie bawi
A.L.
-
9. Data: 2009-08-02 15:02:32
Temat: Re: int 32, int 64, java
Od: A.L. <a...@a...com>
On Sun, 02 Aug 2009 15:13:17 +0100, Mateusz Loskot
<s...@s...net> wrote:
>A.L. wrote:
>> On Sun, 2 Aug 2009 13:28:51 +0000 (UTC), "Mariusz Marszałkowski"
>> <b...@N...gazeta.pl> wrote:
>>
>>> mgk <m...@w...pl> napisał(a):
>>>
>>>> Czyli jak mozna sie bylo spodziewac czas operacji w srodowisku 64bit
>>> No właśnie, zrób lepszy pomiar czasu. Zmierz czas pracy procesora, a nie
>>> czas który upłynął od startu do zakończenia. Pod linuxem jest spacjalna
>>> komenda, chyba "times". Pod windowsem nie umiem nic doradzić.
>>
>> Lava ma metode System.nanoTime() podajaca czas z rozdzielczoscai
>> nanosekundowa.
>
>O ile implementacja nanoTime() bazuje na odpowiednim API systemowym.
>
>Sun pisze [1]
>
>System.nanoTime() is implemented using the
>QueryPerformanceCounter/QueryPerformanceFrequency API (if available,
>else it returns currentTimeMillis*10^6
>
>[1] http://blogs.sun.com/dholmes/entry/inside_the_hotspo
t_vm_clocks
>
"If you are interested in measuring/calculating elapsed time, then
always use System.nanoTime(). On most systems it will give a
resolution on the order of microseconds. Be aware though, this call
can also take microseconds to execute on some platforms."
A.L.
-
10. Data: 2009-08-02 15:04:20
Temat: Re: int 32, int 64, java
Od: Mateusz Loskot <s...@s...net>
A.L. wrote:
> On Sun, 02 Aug 2009 15:13:17 +0100, Mateusz Loskot
> <s...@s...net> wrote:
>
>> A.L. wrote:
>>> On Sun, 2 Aug 2009 13:28:51 +0000 (UTC), "Mariusz Marszałkowski"
>>> <b...@N...gazeta.pl> wrote:
>>>
>>>> mgk <m...@w...pl> napisał(a):
>>>>
>>>>> Czyli jak mozna sie bylo spodziewac czas operacji w srodowisku 64bit
>>>> No właśnie, zrób lepszy pomiar czasu. Zmierz czas pracy procesora, a nie
>>>> czas który upłynął od startu do zakończenia. Pod linuxem jest spacjalna
>>>> komenda, chyba "times". Pod windowsem nie umiem nic doradzić.
>>> Lava ma metode System.nanoTime() podajaca czas z rozdzielczoscai
>>> nanosekundowa.
>> O ile implementacja nanoTime() bazuje na odpowiednim API systemowym.
>>
>> Sun pisze [1]
>>
>> System.nanoTime() is implemented using the
>> QueryPerformanceCounter/QueryPerformanceFrequency API (if available,
>> else it returns currentTimeMillis*10^6
>>
>> [1] http://blogs.sun.com/dholmes/entry/inside_the_hotspo
t_vm_clocks
>>
>
> "If you are interested in measuring/calculating elapsed time, then
> always use System.nanoTime(). On most systems it will give a
> resolution on the order of microseconds. Be aware though, this call
> can also take microseconds to execute on some platforms."
Tak, właśnie o tym pisałem, że przed użyciem warto
zweryfikować czy "black box" nanoTime() na danej platformie
robi to, czego się oczekuje.
Pozdrawiam,
--
Mateusz Loskot, http://mateusz.loskot.net
Charter Member of OSGeo, http://osgeo.org