Let's talk about performance-related design patterns in Java
This article brings you relevant knowledge about java, which mainly introduces the design patterns related to performance. Most design patterns are just a way of organizing code, and only part of the design Patterns are related to performance, including proxy mode, singleton mode, flyweight mode, prototype mode, etc. Let’s take a look at them together. I hope it will be helpful to everyone.
Recommended study: "java Video Tutorial"
The structure of the code has an important impact on the overall performance of the application. Code with excellent structure can avoid many potential performance problems and play a huge role in the scalability of the code; code with clear structure and clear layers can also help you find bottlenecks in the system and carry out special optimization.
Design pattern is a summary of common development techniques. It allows programmers to communicate problems in a more professional and convenient way.
In fact, most design patterns do not increase the performance of the program, it is just a way of organizing the code. In this article, we will give examples one by one to explain several design patterns related to performance, including proxy mode, singleton mode, flyweight mode, prototype mode, etc.
Proxy Mode
Proxy mode (Proxy) can control access to an object through a proxy class.
There are two main modes for implementing dynamic proxies in Java: one is to use JDK, and the other is to use CGLib. Among them, the JDK method is interface-oriented, and the main related classes are InvocationHandler and Proxy; CGLib can proxy ordinary classes, and the main related classes are MethodInterceptor and Enhancer.
The interview frequency for this knowledge point is very high.
CGLib
package cn.wja.proxy.cglibproxy;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CglibInterceptor implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { return methodProxy.invokeSuper(o, objects); }}
package cn.wja.proxy.cglibproxy;import cn.wja.proxy.jdkproxy.Target;import cn.wja.proxy.jdkproxy.TargetImpl;import org.springframework.cglib.proxy.Enhancer;public class CglibFactory { public static Target newInstance() { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(TargetImpl.class); enhancer.setCallback(new CglibInterceptor()); return (Target) enhancer.create(); } public static void main(String[] args) { Target target = newInstance(); System.out.println(target.targetMetod(4)); }}
JDK
package cn.wja.proxy.jdkproxy;public interface Target { int targetMethod(int i);}
package cn.wja.proxy.jdkproxy;public class TargetImpl implements Target { @Override public int targetMethod(int i) { return i * i; }}
package cn.wja.proxy.jdkproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class JdkInvocationHandler implements InvocationHandler { private Target target; public JdkInvocationHandler(Target target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //before Object object = method.invoke(target, args); //after return object; }}
package cn.wja.proxy.jdkproxy;import java.lang.reflect.Proxy;public class JdkFactory { public static Target newInstance(Target target) { Object object = Proxy.newProxyInstance(JdkInvocationHandler.class.getClassLoader(), new Class>[]{Target.class}, new JdkInvocationHandler(target)); return Target.class.cast(object); } public static void main(String[] args) { Target t = new TargetImpl(); Target target = newInstance(t); System.out.println(target.targetMethod(4)); }}
The following are the JMH test results of JDK mode and CGLib mode proxy speed:
Benchmark | Mode | Cnt | Score | Error | Units |
---|---|---|---|---|---|
ProxyBenchmark.cglib | thrpt | 10 | 78499.580 | ±1771.148 | ops/ms |
ProxyBenchmark.jdk | thrpt | 10 | 88948.858 | ±814.360 | ops/ms |
The JDK version I am using now is 1.8. You can see that the speed of CGLib is not that fast (rumored to be 10 times higher). In comparison, It even slows down slightly.
Let’s take a look at the proxy creation speed. The results are as follows. It can be seen that in terms of proxy class initialization, the throughput of JDK is twice that of CGLib.
Benchmark | Mode | Cnt | Score | Error | Units |
---|---|---|---|---|---|
thrpt | 10 | 7281.487 | ± 1339.779 | ops/ms | |
thrpt | 10 | ##15612.467± 268.362 | ops/ms |
The above is the detailed content of Let's talk about performance-related design patterns in Java. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Guide to Square Root in Java. Here we discuss how Square Root works in Java with example and its code implementation respectively.

Guide to Perfect Number in Java. Here we discuss the Definition, How to check Perfect number in Java?, examples with code implementation.

Guide to Random Number Generator in Java. Here we discuss Functions in Java with examples and two different Generators with ther examples.

Guide to Weka in Java. Here we discuss the Introduction, how to use weka java, the type of platform, and advantages with examples.

Guide to the Armstrong Number in Java. Here we discuss an introduction to Armstrong's number in java along with some of the code.

Guide to Smith Number in Java. Here we discuss the Definition, How to check smith number in Java? example with code implementation.

In this article, we have kept the most asked Java Spring Interview Questions with their detailed answers. So that you can crack the interview.

Java 8 introduces the Stream API, providing a powerful and expressive way to process data collections. However, a common question when using Stream is: How to break or return from a forEach operation? Traditional loops allow for early interruption or return, but Stream's forEach method does not directly support this method. This article will explain the reasons and explore alternative methods for implementing premature termination in Stream processing systems. Further reading: Java Stream API improvements Understand Stream forEach The forEach method is a terminal operation that performs one operation on each element in the Stream. Its design intention is
