Tematem niniejszego artykułu była ocena możliwości ręcznej modyfikacji kodu źródłowego w celu optymalizacji czasu wykonania programu. W ramach projektu inżynierskiego zaproponowano autorskie techniki optymalizacyjne, wykorzystujące dekompozycję instrukcji rozgałęziających. Eksperymentalnie zbadano efektywność prezentowanej dekompozycji dla procesora z rodziny Intel x86, wykonującego operacje w sposób potokowy. W ramach niniejszej pracy przebadano kompilatory z rodziny Clang oraz GCC dla języka C i C++ oraz środowisko JVM.
EN
The subject of this article was the manual modification of source code in order of reducing average execution time of certain repeated conditional move operations. This paper is concerned with proposed optimization by utilizing proper decomposition of branching instructions. This article described in detail conditional assignment operations as well as conditional operations and adequate CPU execution in regard of specific processor family architecture. Every discussed topic was supported with simplified comp diagrams. Experiments were conducted based of analysis of decompiled machine code and advanced analysis of CPU pipelining and branch predication mechanisms. Proposed optimized solutions were investigated based on processor from Intel x86 family. Examples of applications of mentioned code manipulations with adequate code snippets were presented with adequate performance analysis. As part of this work, the optimization capabilities of the Clang compiler for C and C++ were analysed and validated. Effectiveness of proposed optimization was experimentally tested also for compilers from collections GCC and for the most popular virtual machine environments such as JVM. Gathered cleared results were presented after carried out statistical analysis on column charts and in simplified tables.
Oszacowanie wydajności optymalizacji przy wykorzystaniu liniowej reprezentacji pośredniej kodu Streszczenie. W niniejszej pracy omówiono i porównano dwie reprezentacje pośrednie kodu. Szczególny nacisk położono na liniową reprezentację pośrednią w kontekście maszyny wirtualnej Mono. Przedstawiono wybrane metody optymalizacji kodu i pokazano wpływ poszczególnych reprezentacji pośrednich na kwestie wydajności wykonania i rozmiaru kodu.
EN
The two intermediate representations are discussed and broadly compared. Particular emphasis has been placed on linear intermediate representation using Mono Virtual Machine. Selected code optimization methods are presented and the impact of several intermediate representations is examined considering execution performance and generated native code size.
Artykuł ten skupia się na wybranych sposobach optymalizacji kodu, przeprowadzanych z użyciem techniki pojedynczego statycznego przypisania (SSA) ze szczególnym uwzględnieniem kontekstu najpopularniejszych obecnie środowisk maszyn wirtualnych. Przedstawiono podstawowe metody optymalizacji kodu, które opierają się na technice przekształcenia kodu do wspomnianej postaci. Zaprezentowano metodę konstrukcji grafów przepływu sterowania oraz skupiono się na możliwości jej wykorzystania do redukcji obliczeń. Na podstawie przykładowego kodu przedstawiono możliwość optymalizacji SSA w wiodących systemach maszyn wirtualnych Java VM, .NET Framework i Mono. Eksperymentalnie oceniono wpływ ręcznego wykonania optymalizacji przez programistę w odniesieniu do optymalizacji wykonywanej automatycznie przez kompilator JIT.
EN
This article focuses on some ways to optimize the code, carried out us-ing the technique of static single assignment (SSA) with particular emphasis on the context of today's most popular virtual machine environments. The basic methods of code optimization, which are based on the technique of recasting the code to that form are presented. Also a method of design control flow graphs and focused on the possibility of its use to reduce the calculations is shown. Based on the example code, the possibility of optimizing the SSA in leading systems, virtual machines Java VM, the .NET Framework and Mono was considered. Experimentally the impact of manual performance optimization by the programmer in relation to the optimization per-formed automatically by the JIT compiler was carried out.
This paper presents the use of code optimization method in the component environments (Java VM, MS .NET, Mono). In the proposed solution implemented for component environments there are occurrences when manual code optimization can accelerate run time of programs. In components environments, due to the JIT (Just In Time) optimization, the code cannot be fully optimized because of the short time available. JIT optimization takes place during execution of the currently used part of the code. That is why the time spent on searching the best optimization must be balanced between the user waiting time and the choice of optimal optimization. This article presents optimization method ending with conclusion on when, why and in which component environment is recommended to use a given method. The presented methods is called early exit from function (authorial method).
PL
Artykuł prezentuje użycie metody optymalizacji kodu w środowiskach komponentowych (Java VM, MS .NET, Mono). W zaproponowanej metodzie w środowiskach komponentowych występują przypadki, gdy ręczne zastosowanie optymalizacji pozwala przyspieszyć program. Ze względu na używanie kompilatora JIT (Just In Time) w środowiskach komponentowych, kod nie może być w pełni zoptymalizowany (ograniczenia czasowe). Kompilator JIT stosuje optymalizacje podczas uruchamiania aktualnie używanej części kodu. Z tego powodu czas użyty na poszukiwanie optymalizacji musi być zrównoważony między czasem oczekiwania przez użytkownika a wyborem zadowalającej optymalizacji. Artykuł prezentuje analizę metody optymalizacji zakończoną wnioskami, które pozwalają odpowiedzieć na pytania: kiedy, czemu oraz w których środowiskach komponentowych należy użyć metody optymalizacji. Prezentowana w artykule autorska metoda nosi nazwę „wcześniejszego wychodzenia z funkcji”.
This paper describes the manually use of the lazy evaluation code optimization method in the component environments such as Java VM, MS .NET, Mono. Despite the implemented solutions in optimizers, there are occurrences when manual code optimization can accelerate execution of programs. In component environments, due to the optimization performed during JIT (Just In Time) compilation, the code cannot be fully optimized because of the short time available. JIT optimization takes place during execution of the currently used part of the code. That is the reason why the time spent on searching the best optimization methods must be balanced between the program response time and the choice of optimal optimization. This article presents optimization method ending with conclusion to answer in which component environment is recommended to use a given method manually. The presented method is called lazy evaluation.
PL
Artykuł opisuje użycie metody optymalizacji kodu “lazy evaluation” w środowiskach komponentowych (Java VM, MS .NET, Mono). Pomimo zaimplementowanych rozwiązań w optymalizatorach, występują przypadki, gdy doraźne zoptymalizowanie kodu skutkuje przyspieszeniem pracy programu. Optymalizacja kodu jest przeprowadzana podczas kompilacji JIT (Just In Time) w środowiskach komponentowych, dlatego kod nie może zostać w pełni zoptymalizowany. Optymalizacja i kompilacja następuje w momencie wywołania danej części kodu przez aplikację. Skutkuje to ograniczonym czasem, który jest dostępny na poszukiwanie najlepszej optymalizacji. Dostępny czas musi zostać zbalansowany pomiędzy czas odpowiedzi programu, a wybór optymalnej metody optymalizacji. Artykuł zakończono wnioskami, które pozwalają odpowiedzieć na pytanie, kiedy użycie metody “lazy evaluation” jest zalecane.
JavaScript jest wyłączony w Twojej przeglądarce internetowej. Włącz go, a następnie odśwież stronę, aby móc w pełni z niej korzystać.