Testowanie wydajności języka w pętli

0

Cześć. Czy testowanie wydajności poszczególnych funkcji języka w nieskończonej pętli ma sens?
Dlaczego akurat w nieskończonej pętli? ciężko jest mi wyłapać zużycie CPU programu, który wykonuje się w sekundę, a większość programów tak właśnie się robi.
Program z którego korzystam (ProcessExplorer) pokazuje zużycie CPU w realtime i uzycie CPU pokazuje się jedynie na sekundę(a i też nie zawsze).

Przykładowy program to zapis 125MB randomowego tekstu do pliku w javie.
Pętla for w tym przypadku ma symulować środowisko wykonywanie takiego zadania:


while(true) {
            try (FileOutputStream fos = new FileOutputStream("C:\\io/test.txt")) {
                fos.write(new byte[128000000]);
            } catch (IOException e) {
                //logger
            }   
        }

Zużycie CPU jest w tym przypadku dobrze widoczne w programie ProcessExplorer i mogę wykonywać badania.

Pytanie czy taki wynik zużycia nie będzie przekłamany.

5

Na 100% w tym programie bottle-neckiem będzie I/O, nie CPU - stąd mierzenie wydajności tego kodu nie ma sensu, chyba że robisz benchmark dysku twardego.

Co próbujesz osiągnąć?

0
Patryk27 napisał(a):

Na 100% w tym programie bottle-neckiem będzie I/O, nie CPU - stąd mierzenie wydajności tego kodu nie ma sensu, chyba że robisz benchmark dysku twardego.

Co próbujesz osiągnąć?

Właśnie zdaję sobie sprawę ze będzie to korzystało w tym przypadku z wątków I/O Bound, taki był mój zamiar.

Próbuję porównać wydajność Go oraz Javy.

Z tego co mi się wydaje to każdy język inaczej zarządza wątkami/w inny sposób pobiera dane z dysku przez co użycie CPU będzie się różnić.

1

zdaję sobie sprawę ze będzie to korzystało w tym przypadku z wątków I/O Bound, taki był mój zamiar.

Nie ma czegoś takiego jak wątki I/O bound.

Próbuję porównać wydajność Go oraz Javy.

Wydajność Go oraz Javy w tym przykładzie będzie niemalże identyczna, ponieważ najwięcej tutaj do powiedzenia będzie miał kernel oraz dysk twardy, które nie są częścią Twojego oprogramowania i które działają tak samo, niezależnie od tego, w czym masz napisaną aplikację.

Z tego co mi się wydaje to każdy język inaczej (...) pobiera dane z dysku

Masz jakieś źródło na tak odważne stwierdzenie? ;-)

Każdy język (z pewnymi drobnymi uproszczeniami typu asynchroniczność) będzie zachowywał się podobnie - tzn. zarezerwuje bufor na dane, zawoła kernel i to tyle, nie ma tutaj zbyt wiele pola do popisu.

Lepiej sprawdziłbyś wydajność "języka" (czy raczej konkretnego kompilatora oraz maszyny wirtualnej) pisząc coś typowo CPU-bound, np. raytracing.

0
Patryk27 napisał(a):

zdaję sobie sprawę ze będzie to korzystało w tym przypadku z wątków I/O Bound, taki był mój zamiar.

Nie ma czegoś takiego jak wątki I/O bound.

Próbuję porównać wydajność Go oraz Javy.

Wydajność Go oraz Javy w tym przykładzie będzie niemalże identyczna, ponieważ najwięcej tutaj do powiedzenia będzie miał kernel oraz dysk twardy, które nie są częścią Twojego oprogramowania i które działają niezależnie od tego, w czym masz napisaną aplikację.

Z tego co mi się wydaje to każdy język inaczej (...) pobiera dane z dysku

Masz jakieś źródło na tak odważne stwierdzenie? ;-)

Każdy język (z pewnymi drobnymi uproszczeniami typu asynchroniczność) zachowuje się tak samo - rezerwuje bufor na dane, woła kernel i na tym kończy się rola języka. Nie ma tutaj zbyt wiele pola do popisu.

Masz rację, co do ostatniego to nie mam takich informacji. Co masz na myśli przez stwierdzenie "Wydajność Go oraz Javy w tym przykładzie będzie niemalże identyczna"? różnica 5? 10% zużycia CPU?

Jakie zadania byś polecił aby to wszystko miało sens?

1

Co masz na myśli przez stwierdzenie "Wydajność Go oraz Javy w tym przykładzie będzie niemalże identyczna"? różnica 5? 10% zużycia CPU?

Różnica 0%.

Jakie zadania byś polecił aby to wszystko miało sens?

Np. raytracing / obsługa setek tysięcy żądań HTTP przez loopback (tutaj Go powinno być nieco lepsze ze swoimi go-routines, choć ofc. niekoniecznie).

0
Patryk27 napisał(a):

Co masz na myśli przez stwierdzenie "Wydajność Go oraz Javy w tym przykładzie będzie niemalże identyczna"? różnica 5? 10% zużycia CPU?

Różnica 0%.

Jakie zadania byś polecił aby to wszystko miało sens?

Np. raytracing / obsługa setek tysięcy żądań HTTP przez loopback (tutaj Go powinno być nieco lepsze ze swoimi go-routines, choć ofc. niekoniecznie).

Rozumiem, obsługę żądań spróbuję ogarnąć.
A co byś polecał jeśli chodzi o "rzucanie" danymi ? testowanie podstawowych funkcji obu języków, czyli tablice itp

0

W sensie, że pod jakim względem polecał?

0
Patryk27 napisał(a):

W sensie, że pod jakim względem polecał?
Źle to ująłem, chodziło mi bardziej o to, jakie operacje wydają się Tobie bardziej rozsądne, aby przetestować wydajność tych dwóch języków.

Odnośnie żądań HTTP'S to polecasz jakieś narzędzie do tego typu rzeczy? nie chciałbym używać springów ani JavyEE

0
Sumekprog napisał(a):
Patryk27 napisał(a):

W sensie, że pod jakim względem polecał?
Źle to ująłem, chodziło mi bardziej o to, jakie operacje wydają się Tobie bardziej rozsądne, aby przetestować wydajność tych dwóch języków.

Odnośnie żądań HTTP'S to polecasz jakieś narzędzie do tego typu rzeczy? nie chciałbym używać springów ani JavyEE

Hasło do Googla: "java web stress testing"
Pierwszy wynik: https://jmeter.apache.org/

Jak chcesz porównywać 2 języki możesz też użyć:
https://locust.io/

Więcej: https://www.digitalocean.com/community/tutorials/an-introduction-to-load-testing

1

Nie ma czegoś takiego jak wydajność jezyka.
Jest wydajnośc konkretnego kodu skompilowanego konkretnym kompilatorem (i w javie szczególnie odpalanego w konkretnym runtime (JVM) ). Zresztą kompilator javy siedzi w zasadzie w JVM.

Pamietaj, że standardowy JVM (oracle) zakłada, że robisz zadania długie, serwerowe i jak coś odpala się na kilkanascie milisekund to JVM nawet nie zada sobie trudu żeby to skompilować.
O testowaniu wydajności javy najlepiej poszukać pod hasłem JMH - to framework do benchmarków. Jest wiele video, które pokazuje na co trzeba uważać - żeby wyniki nie wyszły nierealistycznie dobre, albo nierealistycznie złe.
W szczególności jak liczysz coś w pętli i nie przekazujesz wyniku na zewnątrz to jvm potrafi wyciąć całkowicie ten kod i masz 0ms :-)
https://www.oracle.com/technetwork/articles/java/architect-benchmarking-2266277.html

Jak robisz krótkie programiki (na milisekundy) to java (JVM oracle) średnio się do tego nadaje, a jeśli już to trzeba użyć ahead of time compilation. (https://www.baeldung.com/ahead-of-time-compilation)
(przy czym tak skompilowany kod (do natywnego executable) jest w dłuższych zadaniach wyraźnie wolniejszy od normalnego trybu (JIT)) .

1 użytkowników online, w tym zalogowanych: 0, gości: 1