W prezentacji pokażę jak wykorzystać narzędzie JMH do budowy microbenchmarków testujących wydajność zadanych kawałków kodu. Nabyte umiejętności pozwolą słuchaczom sprawdzić wydajność wybranych fragmentów kodu bez niebezpieczeństwa popełnienia, typowych dla tego typu testowania, błędów związanych z np. wygrzewaniem maszyny wirtualnej czy działalnością garbage collectora.
Na rynku mamy kilka/kilkanaście narzędzi to testów wydajnościowych. Jedne są lepsze inne tańsze. Niestety nawet te z górnej półki czasami zawodzą, i trzeba się posiłkować innymi rozwiązaniami.
W swojej prezentacji pokażę cztery problemy z testami wydajnościowymi – których nie daje się rozwiązać za pomącą HP LoadRunnera, a w których pomogły narzędzia darmowe:
Dlaczego nagrany skrypt, przy oddawaniu, generuje błędy – i jak go poprawić.
Jak znaleźć to, co się nie nagrało – i ewentualnie dodać do skryptu?
Dlaczego logowanie trwa tak długo?
Jak bez wyciągania ciężkich dział sprawdzić co jest wąskim gardłem.
Narzędzia które chciałbym krótko omówić to:
WinMerge,
Notepad++,
Filddler,
PerfMon
Apache JMeter™ to otwarte oprogramowanie, napisane w Javie i dedykowane do wykonywania testów obciążeniowych, wydajnościowych oraz funkcjonalnych. Oryginalnie było projektowane i rozwijane przez Stefano Mazzocchi z Apache Software Foundation, który napisał go do testowania wydajności Apache JServ (projektu, który został zastąpiony przez Apache Tomcat). Następnie JMeter został przeprojektowany i wyposażony w GUI celem rozszerzenia jego zastosowań do testów funkcjonalnych. W listopadzie 2011 roku JMeter stał się projektem Apache najwyższego poziomu (ang. top level), co oznacza, że zyskał społeczność odpowiedzialną za jego rozwój (ang. Project Management Commitee) oraz dedykowany serwis.
Apache JMeter jest używany do testowania wydajności statycznych oraz dynamicznych zasobów takich jak pliki, dynamiczne języki programowania serwisów internetowych, np. PHP, Java, ASP.NET, itp., obiekty Java, bazy danych i kwerendy, serwery FTP, itp. Z powodzeniem jest wykorzystywany do symulowania wzmożonego ruchu na serwerze, grupie serwerów, w sieci lub na „hartowanym” obiekcie. Służy również do analizowania całkowitej wydajności pod obciążeniem różnego typu, np. do graficznej analizy całkowitej wydajności lub do testowania zachowania się serwera / skryptu / obiektu przy wzmożonym i zrównoleglonym obciążeniu.
Na rynku mamy kilka/kilkanaście narzędzi to testów wydajnościowych. Jedne są lepsze inne tańsze. Niestety nawet te z górnej półki czasami zawodzą, i trzeba się posiłkować innymi rozwiązaniami.
W swojej prezentacji pokażę cztery problemy z testami wydajnościowymi – których nie daje się rozwiązać za pomącą HP LoadRunnera, a w których pomogły narzędzia darmowe:
Dlaczego nagrany skrypt, przy oddawaniu, generuje błędy – i jak go poprawić.
Jak znaleźć to, co się nie nagrało – i ewentualnie dodać do skryptu?
Dlaczego logowanie trwa tak długo?
Jak bez wyciągania ciężkich dział sprawdzić co jest wąskim gardłem.
Narzędzia które chciałbym krótko omówić to:
WinMerge,
Notepad++,
Filddler,
PerfMon
Apache JMeter™ to otwarte oprogramowanie, napisane w Javie i dedykowane do wykonywania testów obciążeniowych, wydajnościowych oraz funkcjonalnych. Oryginalnie było projektowane i rozwijane przez Stefano Mazzocchi z Apache Software Foundation, który napisał go do testowania wydajności Apache JServ (projektu, który został zastąpiony przez Apache Tomcat). Następnie JMeter został przeprojektowany i wyposażony w GUI celem rozszerzenia jego zastosowań do testów funkcjonalnych. W listopadzie 2011 roku JMeter stał się projektem Apache najwyższego poziomu (ang. top level), co oznacza, że zyskał społeczność odpowiedzialną za jego rozwój (ang. Project Management Commitee) oraz dedykowany serwis.
Apache JMeter jest używany do testowania wydajności statycznych oraz dynamicznych zasobów takich jak pliki, dynamiczne języki programowania serwisów internetowych, np. PHP, Java, ASP.NET, itp., obiekty Java, bazy danych i kwerendy, serwery FTP, itp. Z powodzeniem jest wykorzystywany do symulowania wzmożonego ruchu na serwerze, grupie serwerów, w sieci lub na „hartowanym” obiekcie. Służy również do analizowania całkowitej wydajności pod obciążeniem różnego typu, np. do graficznej analizy całkowitej wydajności lub do testowania zachowania się serwera / skryptu / obiektu przy wzmożonym i zrównoleglonym obciążeniu.
Automation of functional tests using JMeter (in Polish)Tieto Corporation
Presentation from a webinar dedicated to a user who don't have previous experience with automation of web applications tests using JMeter tool. At this virtual meet up you will get basic theoretical knowledge about automation test and some practical examples of using JMeter tool.
The webinar on YouTube: http://youtu.be/3_o3IOJEcxw
Tomasz Stupak is Senior Test Engineer working for 5 years in Tieto. During his profession career he has experience with software and hardware testing.
Apache JMeter™ to otwarte oprogramowanie, napisane w Javie i dedykowane do wykonywania testów obciążeniowych, wydajnościowych oraz funkcjonalnych. Oryginalnie było projektowane i rozwijane przez Stefano Mazzocchi z Apache Software Foundation, który napisał go do testowania wydajności Apache JServ (projektu, który został zastąpiony przez Apache Tomcat). Następnie JMeter został przeprojektowany i wyposażony w GUI celem rozszerzenia jego zastosowań do testów funkcjonalnych. W listopadzie 2011 roku JMeter stał się projektem Apache najwyższego poziomu (ang. top level), co oznacza, że zyskał społeczność odpowiedzialną za jego rozwój (ang. Project Management Commitee) oraz dedykowany serwis.
Apache JMeter jest używany do testowania wydajności statycznych oraz dynamicznych zasobów takich jak pliki, dynamiczne języki programowania serwisów internetowych, np. PHP, Java, ASP.NET, itp., obiekty Java, bazy danych i kwerendy, serwery FTP, itp. Z powodzeniem jest wykorzystywany do symulowania wzmożonego ruchu na serwerze, grupie serwerów, w sieci lub na „hartowanym” obiekcie. Służy również do analizowania całkowitej wydajności pod obciążeniem różnego typu, np. do graficznej analizy całkowitej wydajności lub do testowania zachowania się serwera / skryptu / obiektu przy wzmożonym i zrównoleglonym obciążeniu.
Context Driven School of testing w prostych przykładachRadoslaw Smilgin
Szkoła testowanie sterowanego kontekstem to jedno z najważniejszych metod testowania promująca testerów myślących i krytycznych względem produktu.
Slajdy z darmowego webinarium.
4Developers 2018: Unit testing - introduction (Marek Kawczyński)PROIDEA
This short presentation is for people who would like to start with writing unit tests. I will try to introduce idea and definition of unit testing. With simple examples, we will go through the whole unit testing development process. Unit test, mocks, stubs, TDD and more definitions will be explained in real cases.
I will try to show how and what should be tested. Of course, everything is based on my personal experience that I have gained in my developer life in the last 10+ years.
Podsumowanie analizy narzędzia do zarządzania testowaniem za rozsądną cenę. Spośród dziesiąteki kandydatów i finałowej czwórki: SpiratTest, TestLink, SynapseRT, TestRail ostatecznie wygrywa...
JDD 2016 - Michal Matloka - Small Intro To Big DataPROIDEA
Pig, Hive, Flink, Kafka, Zeppelin... if you now wonder if someone just tried to offend you or are those just Pokemon names, then this talk is just for you! Big Data is everywhere and new tools for it are released almost at the speed of new JavaScript frameworks. During this entry level presentation we will walk though the challenges which Big Data presents, reflect how big is big and introduce currently most fancy and popular (mostly open source) tools. We'll try to spark off interest in Big Data by showing application areas and by throwing ideas where you can later dive into.
JDD 2016 - Tomasz Gagor, Pawel Torbus - A Needle In A LogstackPROIDEA
Case study on how a well thought through log analysis that enable mobile developers to get e clearer picture of how their mobile app performs across a spectrum of devices. And how the information contained in logs when presented in a Human readable manner can have a tremendous impact on problem trouble shooting, deployments, and provide valuable business feedback. How to see the mobile end of an e-publishing platform. Currently a signify cant number of systems and apps need to work in distributed meaner. For back-end this means a cluster of servers, multiple availability zones or regions. For mobile a an astonishing number of mobile devices, with different and constantly changing characteristics Tests and code analysis do no always provide the an answer on how the users/devices work with the app created. we need to get true data from “the wild”. Event collecting/analyzing systems allow us to gather the data, filter it, transform it and swiftly act upon. Enter the world of event collecting, processing, visualizing and integrating it into an ecosystem. Discover it with more ease learning form our successes as well as mistakes.
Do you think you're doing microservice architecture? What about infrastructur...Marcin Grzejszczak
Slides from the presentation
So you're thinking you're doing microservice architecture? What about infrastructure and provisioning?
from the 4developers conference at Warsaw
Automation of functional tests using JMeter (in Polish)Tieto Corporation
Presentation from a webinar dedicated to a user who don't have previous experience with automation of web applications tests using JMeter tool. At this virtual meet up you will get basic theoretical knowledge about automation test and some practical examples of using JMeter tool.
The webinar on YouTube: http://youtu.be/3_o3IOJEcxw
Tomasz Stupak is Senior Test Engineer working for 5 years in Tieto. During his profession career he has experience with software and hardware testing.
Apache JMeter™ to otwarte oprogramowanie, napisane w Javie i dedykowane do wykonywania testów obciążeniowych, wydajnościowych oraz funkcjonalnych. Oryginalnie było projektowane i rozwijane przez Stefano Mazzocchi z Apache Software Foundation, który napisał go do testowania wydajności Apache JServ (projektu, który został zastąpiony przez Apache Tomcat). Następnie JMeter został przeprojektowany i wyposażony w GUI celem rozszerzenia jego zastosowań do testów funkcjonalnych. W listopadzie 2011 roku JMeter stał się projektem Apache najwyższego poziomu (ang. top level), co oznacza, że zyskał społeczność odpowiedzialną za jego rozwój (ang. Project Management Commitee) oraz dedykowany serwis.
Apache JMeter jest używany do testowania wydajności statycznych oraz dynamicznych zasobów takich jak pliki, dynamiczne języki programowania serwisów internetowych, np. PHP, Java, ASP.NET, itp., obiekty Java, bazy danych i kwerendy, serwery FTP, itp. Z powodzeniem jest wykorzystywany do symulowania wzmożonego ruchu na serwerze, grupie serwerów, w sieci lub na „hartowanym” obiekcie. Służy również do analizowania całkowitej wydajności pod obciążeniem różnego typu, np. do graficznej analizy całkowitej wydajności lub do testowania zachowania się serwera / skryptu / obiektu przy wzmożonym i zrównoleglonym obciążeniu.
Context Driven School of testing w prostych przykładachRadoslaw Smilgin
Szkoła testowanie sterowanego kontekstem to jedno z najważniejszych metod testowania promująca testerów myślących i krytycznych względem produktu.
Slajdy z darmowego webinarium.
4Developers 2018: Unit testing - introduction (Marek Kawczyński)PROIDEA
This short presentation is for people who would like to start with writing unit tests. I will try to introduce idea and definition of unit testing. With simple examples, we will go through the whole unit testing development process. Unit test, mocks, stubs, TDD and more definitions will be explained in real cases.
I will try to show how and what should be tested. Of course, everything is based on my personal experience that I have gained in my developer life in the last 10+ years.
Podsumowanie analizy narzędzia do zarządzania testowaniem za rozsądną cenę. Spośród dziesiąteki kandydatów i finałowej czwórki: SpiratTest, TestLink, SynapseRT, TestRail ostatecznie wygrywa...
JDD 2016 - Michal Matloka - Small Intro To Big DataPROIDEA
Pig, Hive, Flink, Kafka, Zeppelin... if you now wonder if someone just tried to offend you or are those just Pokemon names, then this talk is just for you! Big Data is everywhere and new tools for it are released almost at the speed of new JavaScript frameworks. During this entry level presentation we will walk though the challenges which Big Data presents, reflect how big is big and introduce currently most fancy and popular (mostly open source) tools. We'll try to spark off interest in Big Data by showing application areas and by throwing ideas where you can later dive into.
JDD 2016 - Tomasz Gagor, Pawel Torbus - A Needle In A LogstackPROIDEA
Case study on how a well thought through log analysis that enable mobile developers to get e clearer picture of how their mobile app performs across a spectrum of devices. And how the information contained in logs when presented in a Human readable manner can have a tremendous impact on problem trouble shooting, deployments, and provide valuable business feedback. How to see the mobile end of an e-publishing platform. Currently a signify cant number of systems and apps need to work in distributed meaner. For back-end this means a cluster of servers, multiple availability zones or regions. For mobile a an astonishing number of mobile devices, with different and constantly changing characteristics Tests and code analysis do no always provide the an answer on how the users/devices work with the app created. we need to get true data from “the wild”. Event collecting/analyzing systems allow us to gather the data, filter it, transform it and swiftly act upon. Enter the world of event collecting, processing, visualizing and integrating it into an ecosystem. Discover it with more ease learning form our successes as well as mistakes.
Do you think you're doing microservice architecture? What about infrastructur...Marcin Grzejszczak
Slides from the presentation
So you're thinking you're doing microservice architecture? What about infrastructure and provisioning?
from the 4developers conference at Warsaw
4Developers: Mateusz Stasch- Domain Events - czyli jak radzić sobie z rzeczyw...PROIDEA
Będę mówił o tym jak radzić sobie z zastanym stanem świata. Dlaczego z zastanym? Bo skoro już reagujemy na zdarzenie, to coś się stało i się nie odstanie. Koniec kropka. W trakcie wykładu postaram się wprowadzić koncepcję zdarzeń domenowych, opowiedzieć gdzie plasują się one na płaszczyźnie szeroko pojętego i przeładowanego w IT słowa event. Opowiem jak implementować zdarzenia, co jest zdarzeniem, a co nie jest oraz jakie benefity i koszty wnoszą do naszego kodu. Pokażę także, jak zdarzenia wykorzystać żeby ułatwić sobie pracę oraz podzielę się ze słuchaczami kilkoma regułami kciuka, które stosuję w trakcie pracy ze zdarzeniami.
JDD 2016 - Tomasz Borek - DB for next project? Why, Postgres, of course PROIDEA
PostgreSQL is a battle-tested, open source database with a colorful history dating back to 1987. It has many advantages for a next project, including support for multiple programming languages for stored procedures, handling of XML and JSON, strong error reporting and logging, and window functions. It has a solid architecture with well-designed processes for handling write-ahead logs, statistics collection, and query optimization. While PostgreSQL has a learning curve, its longevity, stability, feature set and performance make it a great choice for many applications.
2016 - Daniel Lebrero - REPL driven developmentPROIDEA
New computers have more and more available memory which for us, programmers means we can use more memory in our applications.
However in JAVA (actually all JVM based languages) at some certain point things may get tricky, especially when we expect from our applications to be responsive all the time. This talk will focus on Garbage First collector (the new default in JDK9) which is the newest algorithm available in HotSpot JVM (not so new though) and the only one which can handle 32+GB heap size without blocking your application threads for longer than 200ms. After this talk you will have overview how G1 works, how to read the log, spot common problems and which gc settings you should avoid.
JDD 2016 - Christin Gorman - Concurrency in JavaPROIDEA
This document discusses concurrency in Java. It defines parallelism as tasks running simultaneously on different processors, while concurrency is tasks making progress at the same time by time slicing on one or more processors. It demonstrates how creating too many threads can cause out of memory errors, but using an ExecutorService with a thread pool avoids this issue. The document concludes with a quote about the dangers of synchronous RPC calls in distributed systems.
Programiści aplikacji Mobilnych na Androida, uwięzieni w czasach Java 1.7 od pewnego czasu eksperymentowali z innymi językami programowania. Żaden nie zdobył do tej pory takiej popularności jak Kotlin. Ale czy faktycznie jest to coś rewolucyjnego? Przecież getery, settery i konstruktory wygenerujemy za pomocą Lomboka. Używając Retrolamby zyskamy wsparcie dla dopełnień. A dodatkowo od niedawna Android ma wsparcie dla Javy 8.
Zatem co decyduje o sile Kotlina, które konstrukcje i właściwości języka powodują, że warto zastosować go w swoim projekcie? Jaki wpływ będzie to miało na architekturę aplikacji i wydajność? Kotlin jest tylko ciekawostką czy spowoduje, że będziesz kodował efektywniej? Z tej prezentacji wyniesiesz pełen zestaw informacji pozwalający odpowiedzieć na wszystkie te pytania.
JDD 2016 - Pawel Szulc - Writing Your Wwn RDD For Fun And ProfitPROIDEA
You all know what RDD stands for, right? You have the mental model of a distributed collection. But have you ever consider writing your own RDD? During this talk we will do just that. We will start by explaining essence of how RDDs are implemented internally, following by semi-live demo (*), where we will implement few RDDs from the scratch.
After this talk you will not only be able to write your own RDD, but you will also have a deeper understanding of how Apache Spark works under the hood.
I guarantee fun during the talk and profit during your next job interview.
(*) by 'semi-live' author means not really code live because that almost never works, but slowly pulling small commits from the repo :)
Java 8's lambdas empower us to create wonderful APIs. Javaslang lets us dive deeper into the world of functional programming by providing us with persistent data types, immutable collections and functional control structures. The results are beautiful and do just work.
During this presentation we will recall Java8's downsides and explore how Javaslang's Scala-inspired features fill-in the gaps.
JDD 2016 - Grzegorz Rozniecki - Java 8 What Could Possibly Go WrongPROIDEA
It’s late 2016, so you probably have been using Java 8 goodies for a while: lambdas, Stream, Optional, new date API ‒ stuff which makes Java development much more pleasant. But the question is: do you know these tools well? I bet you said yes, because writing sweet Java 8 code is piece of cake ‒ you’re using efficient, parallel streams and many lambdas, so what could possibly go wrong? Let me put this straight: most probably you’re doing something wrong. In this talk I won’t actually try to prove that you don’t know what you’re doing, on the contrary ‒ I’ll try to help you be a better programmer by pointing out few mistakes you can make when writing Java 8 code (I know that because I made them all). I’ll also discuss couple common misconceptions regarding Stream and Optional and mention missing language features (also if there is a chance to see them in Java 9 or what library should you use instead). Last but not least, I’ll present you a number of lesser-known gems I found in deepest corners of JDK API, which, I hope, will make your life as a software developer a little bit easier.
JDD 2016 - Michał Balinski, Oleksandr Goldobin - Practical Non Blocking Micro...PROIDEA
We will show how to write application in Java 8 that do not waste resources and which can maximize effective utilization of CPU/RAM. There will be presented comparison of blocking and non-blocking approach for I/O and application services. Based on microservices implementing simple business logic in security/cryptography/payments domain, we will demonstrate following aspects: * NIO at all edges of application * popular libraries that support NIO * single instance scalability * performance metrics (incl. throughput and latency) * resources utilization * code readability with CompletableFuture * application maintenance and debugging All above based on our experiences gathered during development of software platforms at Oberthur Technologies R&D Poland.
Automatyzacja w praktyce. Praktyka automatyzacjiRadoslaw Smilgin
Automatyczna kontrola jakości oprogramowania jest obecnie w topie pożądanych działań projektowych. Można uznać, że w większości to właśnie zespoły testerskie są odpowiedzialne za dobór właściwego narzędzia, wdrożenie i utrzymanie automatyzacji w organizacji. Podczas prezentacji skupię się na analizie obecnej sytuacji projektów automatyzacji i roli testerów w tym procesie. Bazuję na dostępnych źródłach, własnych obserwacjach, rozmowach z ekspertami oraz na wynikach ankiety przeprowadzonej na testerzy.pl
Najważniejsze tematy:
– proces i projekt automatyzacji jest skrajnie trudny (analizując failure rate)
– czynności w automatyzacji nie są tak trudna jak się większości wydaje
– automatyzacja może być tańsza
– automatyzacja może dostarczać jeszcze większą wartość.
Wbrew powszechnym opiniom, nie tak prosto jest zrobić dobre Code Review. Robione w pośpiechu, tylko po to by je "odbębnić", często stwarza więcej szkody niż pożytku. Opowiem wam dlaczego code review jest ważne i jak wykorzystać ten proces aby upewnić się, że napisany kod jest najwyższej jakości. Będę nie tylko mówił o tym kto powinien robić code reviews, i dla kogo, jakie informacje są potrzebne do przeprowadzenia skutecznego code review, ale także jak zrobić dobre code review w najkrótszym możliwym czasie.
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMArtur Skowroński
Myślisz, że znalezienie trufli jest trudne? Spróbuj zrozumieć Truffle w GraalVM!
W tej lekkostrawnej prezentacji zamierzam uprościć to, co skomplikowane, i wyjaśnić rolę Truffle w ekosystemie GraalVM. Kontynuując kulinarną analogię, wyobraź sobie Truffle jako tajemniczy składnik, który wyciąga prawdziwy aromat GraalVM – wspiera wiele języków i zwiększa wydajność, tak jak prawdziwe trufle dodają daniu smak.
Przebijemy się przez techniczny żargon i wyjaśnimy, co naprawdę oznacza "framework implementacji języka". Dowiesz się, jak działa Truffle, dlaczego jest ważne, a nawet spróbujemy napisać jakiś kawałek prostego języka – zgodnie z zasadą "słowa są tanie, pokaż mi kod"
Konrad Gadzina: Test-Driven Gamedev - testy automatyczne a tworzenie gierGameDesire Academy
Celem prezentacji jest przedstawienie korzyści, jakie developerzy gier mogą wyciągnąć z tworzenia testów automatycznych i odpowiedź na kilka podstawowych pytań, m.in. czy gry są zbyt skomplikowane na automatyzacje testów? Co i jak testować - od testów jednostkowych po testy integracyjne. Czym jest "red-green-refactor mantra"? Jak Test-Driven Development wychodzi ze starcia z legacy code? Oraz jak coding dojo może pomóc wdrożyć zespół w TDD?
Prowadzący - Konrad Gadzina, Senior Software Engineer w Ganymede
Link do YT: https://youtu.be/5_af-R3WxdY
Dobry system musi być przetestowany pod względem wydajnościowym. Takie testy są zupełnie inne niż testy funkcjonalne: zamiast binarnego rezultatu (pass, fail), mamy ogromne ilości danych do zebrania, zaprezentowania i zinterpretowania. Podczas wystąpienie prelegent omówi cały cykl testów wydajnościowych: od przygotowania warunków testu, środowisk i danych testowych, poprzez przeprowadzenie testów, zebranie danych, ich prezentację i interpretacje, aż po przeprowadzenie procesów decyzyjnych wynikających z danych.
Testy wydajnościowe to nie tylko JMeter. Podobnie jak w przypadku testów automatycznych, liczba frameworków do badania wydajności stale rośnie. Poza wprowadzeniem w tematykę testów wydajnościowych, w trakcie prezentacji przyjrzymy się ich implementacji we frameworku k6. Opowiemy również dlaczego w The Software House postawiliśmy na jego wybór i jak dzięki prostym skryptom testowym zoptymalizowaliśmy kilka naszych projektów.
Testowanie aplikacji to temat najczęściej pomijany przez programistów. Testowanie nie jest tak pasjonujące jak tworzenie programów czy poznawanie nowych narzędzi. Jest jednak niezbędne. Prawidłowo przeprowadzony proces testowania może znacznie poprawić wydajność, podnieść jakość projektu i kodu, zmniejszyć obciążenia wynikające z konserwacji kodu i pomóc lepiej zaspokoić wymagania klientów, współpracowników i kierownictwa. W powszechnie uznanych metodykach projektowych testowanie, szczególnie za pomocą testów automatycznych, jest niezwykle istotnym procesem.
Książka "Perl. Testowanie. Zapiski programisty" to praktyczny przewodnik dla programistów Perla, którzy chcą poprawić jakość i wydajność tworzonych przez siebie programów. Opisuje metody tworzenia testów automatycznych, stosowania ich i interpretowania ich wyników. Przedstawia sposoby testowania pojedynczych modułów, całych aplikacji, witryn WWW, baz danych, a nawet programów stworzonych w innych językach programowania. Zawiera również informacje o tym, jak dostosować podstawowe narzędzia testujące do własnego środowiska i projektów.
* Instalowanie modułów testujących
* Pisanie testów
* Automatyzacja uruchamiania testów
* Analiza wyników testów
* Dystrybucja testów
* Testy jednostkowe
* Testowanie baz danych
* Testowanie witryn WWW i kodu HTML
Dzięki wiadomościom zawartym w tej książce można zredukować długość cyklu tworzenia oprogramowania i zdecydowanie ułatwić konserwację gotowych systemów.
2. O CZYM BĘDZIEMY MÓWIĆ
• Czym są benchmarki i w czym mogą nam pomóc
• Jakie są problemy z mierzeniem wydajności kodu Javy
• Jak JMH pozwala uniknąć typowych błędów
• Praktyczne przykłady
3. WOJCIECH OCZKOWSKI
• >> 20 lat programowania dla przyjemności
• >> 10 lat zawodowego programowania w Javie
• Branże: Obronna, telco / call-center, finansowa
• Szkolenia
• Wydajność, Architektura, Integracja
• Właściciel IT Kontekst
• Lider Bydgoszcz JUG
• Aktywny członek Toruń JUG
• Ojciec, mąż, żeglarz
5. CO W TYM TRUDNEGO?
long start = System.currentTimeMillis();
work();
System.out.println(
System.currentTimeMillis() - start);
6. WHAT COULD POSSIBLY GO WRONG?
POMIAR CZASU
• Ziarnistość pomiaru czasu
(~30 ns Linux, ~300 ns Windows [1t])
• Ukryty narzut System.nanoTime();
• Błąd pomiaru
• różnice w implementacji timerów w systemach
operacyjnych
7. WHAT COULD POSSIBLY GO WRONG?
OPTYMALIZACJE KOMPILATORA - PĘTLE
• Rozwijanie pętli
• Piplineing
long start = System.nanoTime();
for (int i = 0; i < 100000; i++) {
work();
}
System.out.println((System.nanoTime() - start)/100000);
8. WHAT COULD POSSIBLY GO WRONG?
OPTYMALIZACJE KOMPILATORA – DEAD CODE ELIMINATION
public void measuredMethod(){
// start measurement
int result = work();
// end of measurement
}
9. WHAT COULD POSSIBLY GO WRONG?
OPTYMALIZACJE KOMPILATORA – CONSTANT FOLDING
public int measuredMethod(){
// start measurement
return 42 + work();
// end of measurement
}
10. WHAT COULD POSSIBLY GO WRONG?
FALSE SHARING
int someCounter;
int completelyDifferentCounter;
// on Thread 1
public int measuredMethod1(){
return work(someCounter);
}
// on Thread 2
public int measuredMethod2(){
return work(completelyDifferentCounter);
}
11. WHAT COULD POSSIBLY GO WRONG?
WARM UP
• -XX:CompileThreshold=[1500,2000,10000]
• -XX:-PrintCompilation
• -XX:MaxInlineSize=35
• -XX:+PrintInlining
• -XX:LoopUnrollLimit=n
12. WHAT COULD POSSIBLY GO WRONG?
RÓŻNICE SYSTEMÓW OPERACYJNYCH
• Różnice w implementacji JVM
• Różnice timerów
• Różnice scheduler’ów
• 32 vs 64 bit
• Niektóre optymalizacje dostępne
są dla wybranych OS’ów
• Niektóre bug’i też ;)
13. CZYM JEST JMH I JAK MOŻE POMÓC
• Narzędzie do budowania benchmarków
• Pomaga w uniknięciu typowych problemów
• Nie zwalnia z myślenia o nich.
• Java -> org.openjdk.jmh:jmh-java-benchmark-archetype
• Scala -> org.openjdk.jmh:jmh-scala-benchmark-archetype
-> sbt-jmh plugin
• Groovy -> org.openjdk.jmh:jmh-groovy-benchmark-archetype
• Kotlin -> org.openjdk.jmh:jmh-java-benchmark-archetype
15. # JMH 1.14.1 (released 13 days ago)
# VM version: JDK 1.8.0_77, VM 25.77-b03
# VM invoker: C:Program FilesJavajre1.8.0_77binjava.exe
# VM options: <none>
# Warmup: 20 iterations, 1 s each
# Measurement: 20 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: pl.itkontekst.jmhtest.MyBenchmark.testMethod
# Run progress: 0,00% complete, ETA 00:06:40
# Fork: 1 of 10
# Warmup Iteration 1: 3321638210,400 ops/s
# Warmup Iteration 2: 3035709856,963 ops/s
…
Iteration 19: 3292590873,371 ops/s
Iteration 20: 3352591339,138 ops/s
Result "testMethod":
3336940878,008 ?(99.9%) 21593035,964 ops/s [Average]
(min, avg, max) = (2837336846,716, 3336940878,008, 3433712311,191), stdev =
91426266,353
CI (99.9%): [3315347842,045, 3358533913,972] (assumes normal distribution)
# Run complete. Total time: 00:06:43
Benchmark Mode Cnt Score Error Units
MyBenchmark.testMethod thrpt 200 3336940878,008 ? 21593035,964 ops/s
16. OPCJE POMIARÓW
@Fork(1)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class MyBenchmark {
@Benchmark
public void testMethod() {
}
}
17. KLASY STANU, SETUP, PARAMETRY, BLACK HOLE
@State(Scope.Benchmark)
public static class MyState {
@Param({"1","2","3"})
int value;
@Setup
public void init(){}
}
@Benchmark
public void testAdd(Blackhole blackhole,MyState state) {
blackhole.consume(state.value+state.value);
Blackhole.consumeCPU(10);
}
@Benchmark
public void testMethod(Blackhole blackhole) {
Blackhole.consumeCPU(10);
}
18. WĄTKI, GRUPY, PADDING
@Threads(4)
public class MyBenchmark {
@State(Scope.Benchmark)
public static class MyState {
@Param({"2"})
int value;
}
@State(Scope.Benchmark)
public static class MyState2 {
@Param({"1"})
int value2;
}
@Benchmark
@Group("add")
public void testAdd(Blackhole blackhole,MyState state) {
blackhole.consume(state.value+state.value);
}
@Benchmark
@Group("add")
public void testAdd2(Blackhole blackhole,MyState2 state) {
blackhole.consume(state.value2+state.value2);
}
}
23. WYNIKI
java -jar benchmarks.jar -lrf
Available formats: text, csv, scsv, json, latex
java -jar benchmarks.jar -rff output.csv
24. PODSUMOWANIE
• Pisanie Benchmarków nie jest trywialne
• JMH pomaga w unikaniu typowych problemów ale nie zwalnia z myślenia o
nich
• JMH nie zastąpi ostatecznych testów wydajnościowych
• JIT to potężny oręż, który może Ci obciąć rękę kiedy nie będziesz uważny
25. WARTO POSŁUCHAĆ / POCZYTAĆ
• Aleksey Shipilëv – dzieła wybrane
• Jarosław Pałka – dzieła wybrane
• Charlie Hunt – dzieła wybrane
• Scott Oaks – dzieła wybrane
• Kirk Pepperdine – dzieła wybrane
JMH Samples http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-
samples/src/main/java/org/openjdk/jmh/samples/
Benchmarki - testy rozwiązań skupione na mierzeniu i porównywaniu ich wydajności.
Nawet najlepsi się na tym wykładali
Choć trzeba przyznać że czasy wtedy były inne. (wersja javy, wydajność sprzętu)
- Najczęściej badanie wydajności opieramy o pomiar czasu
Dokładność pomiaru czasu jest jednak ograniczona
Chcąc podejść do sprawy profesjonalnie nie możemy skupić się na pojedynczym pomiarze
Trzeba określić granice niepewności, odchylenie standardowe itp., jest do tego cała teoria opisana np. w monografii GUM.
-zależy od charakterystyki aplikacji
-czasami interesuje nas worst case bo spodziewamy się że nie będzie czasu na warmup