热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请不要再说Java中final方法比非final性能更好了

无继承有static修饰staticfinal生成随机数字和字母,publicstaticfinalStringgetStringRandomFinal(intlength){

640?wx_fmt=jpeg

无继承

有 static 修饰

static final

// 生成随机数字和字母, public static final String getStringRandomFinal(int length) { String val = ""; Random random = new Random(); // 参数length,表示生成几位随机数 for (int i = 0; i

static 非 final

// 生成随机数字和字母, public static String getStringRandom(int length) { String val = ""; Random random = new Random(); // 参数length,表示生成几位随机数 for (int i = 0; i

结果

这里使用了 OpenJDK 的 JMH 基准测试工具来测试的,结果如下:

# JMH 1.4.1 (released 903 days ago, please consider updating!)
# VM invoker: /srv/jdk1.8.0_92/jre/bin/java
# VM options:
# 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: org.agoncal.sample.jmh.Main.benchmark
中间忽略了预热及测试过程,这里只显示结果
Result: 206924.113 ±(99.9%) 7746.446 ops/s [Average] Statistics: (min, avg, max) = (132107.466, 206924.113, 267265.397), stdev = 32798.937 Confidence interval (99.9%): [199177.667, 214670.559]
# JMH 1.4.1 (released 903 days ago, please consider updating!)
# VM invoker: /srv/jdk1.8.0_92/jre/bin/java
# VM options:
# 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: org.agoncal.sample.jmh.Main.benchmarkFinal
中间忽略了预热及测试过程,这里只显示结果
Result: 210111.568 ±(99.9%) 8486.176 ops/s [Average] Statistics: (min, avg, max) = (133813.368, 210111.568, 267525.228), stdev = 35931.001 Confidence interval (99.9%): [201625.392, 218597.744]
# Run complete. Total time: 00:13:54
Benchmark                       Mode  Samples       Score      Error  Units
o.a.s.j.Main.benchmark         thrpt      200  206924.113 ± 7746.446  ops/s
o.a.s.j.Main.benchmarkFinal    thrpt      200  210111.568 ± 8486.176  ops/s

总结:你说final的性能比非final有没有提升呢?可以说有,但几乎可以忽略不计。如果单纯地追求性能,而将所有的方法修改为 final 的话,我认为这样子是不可取的。

而且这性能的差别,远远也没有网上有些人说的提升 50% 这么恐怖(有可能他们使用的是10年前的JVM来测试的吧^_^,比如 《35+ 个 Java 代码性能优化总结》这篇文章。雷总:不服?咱们来跑个分!)

分析

字节码级别的差别

StringKit.java StringKitFinal.java

它们在字节码上的差别:

[18:52:08] emacsist:target $ diff /tmp/stringkit.log /tmp/stringkit-final.log
1,5c1,5
<  Last modified 2017-6-15; size 1098 bytes
<  MD5 checksum fe1ccdde26107e4037afc54c780f2c95
<  Compiled from "StringKit.java"
---
> Classfile /Users/emacsist/Documents/idea/logging/target/classes/org/agoncal/sample/jmh/StringKitFinal.class
>   Last modified 2017-6-15; size 1118 bytes
>   MD5 checksum 410f8bf0eb723b794e4754c6eb8b9829
>   Compiled from "StringKitFinal.java"
> public class org.agoncal.sample.jmh.StringKitFinal
24c24
<  #15 &#61; Class              #52            // org/agoncal/sample/jmh/StringKit
---
>   #15 &#61; Class              #52            // org/agoncal/sample/jmh/StringKitFinal
32,33c32,33
<  #23 &#61; Utf8               Lorg/agoncal/sample/jmh/StringKit;
<  #24 &#61; Utf8               getStringRandom
---
>   #23 &#61; Utf8               Lorg/agoncal/sample/jmh/StringKitFinal;
>   #24 &#61; Utf8               getStringRandomFinal
47c47
<  #38 &#61; Utf8               StringKit.java
---
>   #38 &#61; Utf8               StringKitFinal.java
61c61
<  #52 &#61; Utf8               org/agoncal/sample/jmh/StringKit
---
>   #52 &#61; Utf8               org/agoncal/sample/jmh/StringKitFinal
75c75
<  public org.agoncal.sample.jmh.StringKit();
---
>   public org.agoncal.sample.jmh.StringKitFinal();
87c87
<            0       5     0  this   Lorg/agoncal/sample/jmh/StringKit;
---
>             0       5     0  this   Lorg/agoncal/sample/jmh/StringKitFinal;
89c89
<  public static java.lang.String getStringRandom(int);
---
>   public static final java.lang.String getStringRandomFinal(int);
91c91
<    flags: ACC_PUBLIC, ACC_STATIC
---
>     flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
187c187
---
> SourceFile: "StringKitFinal.java"

可以看到除了方法名和方法修饰符不同之外&#xff0c;其他的没有什么区别了。

在调用者上面的字节码差别

public void benchmark(); descriptor: ()V flags: ACC_PUBLIC Code: stack&#61;1, locals&#61;1, args_size&#61;1 0: bipush        32 2: invokestatic  #2                  // Method org/agoncal/sample/jmh/StringKit.getStringRandom:(I)Ljava/lang/String; 5: pop 6: return LineNumberTable: line 21: 0 line 22: 6 LocalVariableTable: Start  Length  Slot  Name   Signature 0       7     0  this   Lorg/agoncal/sample/jmh/Main; RuntimeVisibleAnnotations: 0: #26() public void benchmarkFinal(); descriptor: ()V flags: ACC_PUBLIC Code: stack&#61;1, locals&#61;1, args_size&#61;1 0: bipush        32 2: invokestatic  #3                  // Method org/agoncal/sample/jmh/StringKitFinal.getStringRandomFinal:(I)Ljava/lang/String; 5: pop 6: return LineNumberTable: line 26: 0 line 27: 6 LocalVariableTable: Start  Length  Slot  Name   Signature 0       7     0  this   Lorg/agoncal/sample/jmh/Main; RuntimeVisibleAnnotations: 0: #26()

可以看到&#xff0c;它们在调用者上面的字节码也没有什么区别&#xff0c;只是方法名不一样之外。

对于 JVM 来说&#xff0c;它是只认字节码的&#xff0c;既然字节码除了方法名和修饰符一样&#xff0c;其他都一样&#xff0c;那就可以大概推测它们的性能几乎可以忽略不计了。因为调用 static final 和 static 非 final 的JVM指令是一样。

无 static 修饰

方法体是一样的&#xff0c;只是将它们删除了 static 的修饰。

结果

# JMH version: 1.19
# VM version: JDK 1.8.0_92, VM 25.92-b14
# VM invoker: /srv/jdk1.8.0_92/jre/bin/java
# VM options:
# 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: org.agoncal.sample.jmh.Main.benchmark
中间忽略了预热及测试过程&#xff0c;这里只显示结果
Result "org.agoncal.sample.jmh.Main.benchmark": 201306.770 ±(99.9%) 8184.423 ops/s [Average] (min, avg, max) &#61; (131889.934, 201306.770, 259928.172), stdev &#61; 34653.361 CI (99.9%): [193122.347, 209491.193] (assumes normal distribution)
# JMH version: 1.19
# VM version: JDK 1.8.0_92, VM 25.92-b14
# VM invoker: /srv/jdk1.8.0_92/jre/bin/java
# VM options:
# 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: org.agoncal.sample.jmh.Main.benchmarkFinal
中间忽略了预热及测试过程&#xff0c;这里只显示结果
Result "org.agoncal.sample.jmh.Main.benchmarkFinal": 196871.022 ±(99.9%) 8595.719 ops/s [Average] (min, avg, max) &#61; (131182.268, 196871.022, 265522.769), stdev &#61; 36394.814 CI (99.9%): [188275.302, 205466.741] (assumes normal distribution)
# Run complete. Total time: 00:13:35
Benchmark             Mode  Cnt       Score      Error  Units
Main.benchmark       thrpt  200  201306.770 ± 8184.423  ops/s
Main.benchmarkFinal  thrpt  200  196871.022 ± 8595.719  ops/s

分析

字节码级别的差别

[19:20:17] emacsist:target $ diff /tmp/stringkit.log /tmp/stringkit-final.log
1,5c1,5
<  Last modified 2017-6-15; size 1110 bytes
<  MD5 checksum f61144e86f7c17dc5d5f2b2d35fac36d
<  Compiled from "StringKit.java"
---
> Classfile /Users/emacsist/Documents/idea/logging/target/classes/org/agoncal/sample/jmh/StringKitFinal.class
>   Last modified 2017-6-15; size 1130 bytes
>   MD5 checksum 15ce17ee17fdb5f4721f0921977b1e69
>   Compiled from "StringKitFinal.java"
> public class org.agoncal.sample.jmh.StringKitFinal
24c24
<  #15 &#61; Class              #52            // org/agoncal/sample/jmh/StringKit
---
>   #15 &#61; Class              #52            // org/agoncal/sample/jmh/StringKitFinal
32,33c32,33
<  #23 &#61; Utf8               Lorg/agoncal/sample/jmh/StringKit;
<  #24 &#61; Utf8               getStringRandom
---
>   #23 &#61; Utf8               Lorg/agoncal/sample/jmh/StringKitFinal;
>   #24 &#61; Utf8               getStringRandomFinal
47c47
<  #38 &#61; Utf8               StringKit.java
---
>   #38 &#61; Utf8               StringKitFinal.java
61c61
<  #52 &#61; Utf8               org/agoncal/sample/jmh/StringKit
---
>   #52 &#61; Utf8               org/agoncal/sample/jmh/StringKitFinal
75c75
<  public org.agoncal.sample.jmh.StringKit();
---
>   public org.agoncal.sample.jmh.StringKitFinal();
87c87
<            0       5     0  this   Lorg/agoncal/sample/jmh/StringKit;
---
>             0       5     0  this   Lorg/agoncal/sample/jmh/StringKitFinal;
89c89
<  public java.lang.String getStringRandom(int);
---
>   public final java.lang.String getStringRandomFinal(int);
91c91
<    flags: ACC_PUBLIC
---
>     flags: ACC_PUBLIC, ACC_FINAL
169c169
<            0     125     0  this   Lorg/agoncal/sample/jmh/StringKit;
---
>             0     125     0  this   Lorg/agoncal/sample/jmh/StringKitFinal;
188c188
---
> SourceFile: "StringKitFinal.java"

可以看到&#xff0c;字节码上除了名字和 final 修饰符差别外&#xff0c;其余的是一样的。

在调用者上面的字节码差别

public void benchmark(); descriptor: ()V flags: ACC_PUBLIC Code: stack&#61;2, locals&#61;1, args_size&#61;1 0: new           #2                  // class org/agoncal/sample/jmh/StringKit 3: dup 4: invokespecial #3                  // Method org/agoncal/sample/jmh/StringKit."":()V 7: bipush        32 9: invokevirtual #4                  // Method org/agoncal/sample/jmh/StringKit.getStringRandom:(I)Ljava/lang/String; 12: pop 13: return LineNumberTable: line 21: 0 line 22: 13 LocalVariableTable: Start  Length  Slot  Name   Signature 0      14     0  this   Lorg/agoncal/sample/jmh/Main; RuntimeVisibleAnnotations: 0: #30() public void benchmarkFinal(); descriptor: ()V flags: ACC_PUBLIC Code: stack&#61;2, locals&#61;1, args_size&#61;1 0: new           #5                  // class org/agoncal/sample/jmh/StringKitFinal 3: dup 4: invokespecial #6                  // Method org/agoncal/sample/jmh/StringKitFinal."":()V 7: bipush        32 9: invokevirtual #7                  // Method org/agoncal/sample/jmh/StringKitFinal.getStringRandomFinal:(I)Ljava/lang/String; 12: pop 13: return LineNumberTable: line 26: 0 line 27: 13 LocalVariableTable: Start  Length  Slot  Name   Signature 0      14     0  this   Lorg/agoncal/sample/jmh/Main; RuntimeVisibleAnnotations: 0: #30()

可以看到&#xff0c;它们除了名字不同之外&#xff0c;其他的JVM指令都是一样的。

总结

对于是否有 final 修饰的方法&#xff0c;对性能的影响可以忽略不计。因为它们生成的字节码除了 flags 标志位是否有 final 修饰不同之外&#xff0c;其他所有的JVM指令&#xff0c;都是一样的&#xff08;对于方法本身&#xff0c;以及调用者本身的字节码都一样&#xff09;。对于JVM来说&#xff0c;它执行的就是字节码&#xff0c;如果字节码都一样的话&#xff0c;那对于JVM来说&#xff0c;它就是同一样东西的了。

有继承

无 final 修饰

package org.agoncal.sample.jmh;
import java.util.Random;
/** * Created by emacsist on 2017/6/15. */
public abstract class StringKitAbs { // 生成随机数字和字母, public String getStringRandom(int length) { String val &#61; ""; Random random &#61; new Random(); // 参数length&#xff0c;表示生成几位随机数 for (int i &#61; 0; i }

有 final 修饰

package org.agoncal.sample.jmh;
import java.util.Random;
/** * Created by emacsist on 2017/6/15. */
public abstract class StringKitAbsFinal { // 生成随机数字和字母, public final String getStringRandomFinal(int length) { String val &#61; ""; Random random &#61; new Random(); // 参数length&#xff0c;表示生成几位随机数 for (int i &#61; 0; i }

测试代码

写一个类来继承上面的抽象类&#xff0c;以此来测试在继承中 final 有否对多态中的影响

package org.agoncal.sample.jmh;
/** * Created by emacsist on 2017/6/15. */
public class StringKitFinal extends StringKitAbsFinal {
}

package org.agoncal.sample.jmh;
/** * Created by emacsist on 2017/6/15. */
public class StringKit extends StringKitAbs {
}

然后在基准测试中:

&#64;Benchmark public void benchmark() { new StringKit().getStringRandom(32); } &#64;Benchmark public void benchmarkFinal() { new StringKitFinal().getStringRandomFinal(32); }

测试结果

非 final 结果

# JMH version: 1.19
# VM version: JDK 1.8.0_92, VM 25.92-b14
# VM invoker: /srv/jdk1.8.0_92/jre/bin/java
# VM options:
# 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: org.agoncal.sample.jmh.Main.benchmark
中间忽略了预热及测试过程
Result "org.agoncal.sample.jmh.Main.benchmark": 213462.677 ±(99.9%) 8670.164 ops/s [Average] (min, avg, max) &#61; (135751.428, 213462.677, 264182.887), stdev &#61; 36710.017 CI (99.9%): [204792.513, 222132.841] (assumes normal distribution)

有 final 结果

# JMH version: 1.19
# VM version: JDK 1.8.0_92, VM 25.92-b14
# VM invoker: /srv/jdk1.8.0_92/jre/bin/java
# VM options:
# 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: org.agoncal.sample.jmh.Main.benchmarkFinal
中间忽略了预热及测试过程
Result "org.agoncal.sample.jmh.Main.benchmarkFinal": 213684.585 ±(99.9%) 8571.512 ops/s [Average] (min, avg, max) &#61; (133472.162, 213684.585, 267742.236), stdev &#61; 36292.318 CI (99.9%): [205113.073, 222256.097] (assumes normal distribution)

总对比

# Run complete. Total time: 00:13:35
Benchmark             Mode  Cnt       Score      Error  Units
Main.benchmark       thrpt  200  213462.677 ± 8670.164  ops/s
Main.benchmarkFinal  thrpt  200  213684.585 ± 8571.512  ops/s

它们字节码的区别

[12:12:19] emacsist:classes $ diff /tmp/StringKit.log /tmp/StringKitFinal.log
1,5c1,5
<  Last modified 2017-6-16; size 317 bytes
<  MD5 checksum 7f9b024adc7f39345215e3e8490cafe4
<  Compiled from "StringKit.java"
---
> Classfile /Users/emacsist/Documents/idea/logging/target/classes/org/agoncal/sample/jmh/StringKitFinal.class
>   Last modified 2017-6-16; size 337 bytes
>   MD5 checksum f54eadc79a90675d97e95f766ef88a87
>   Compiled from "StringKitFinal.java"
> public class org.agoncal.sample.jmh.StringKitFinal extends org.agoncal.sample.jmh.StringKitAbsFinal
10,12c10,12
<   #1 &#61; Methodref          #3.#13         // org/agoncal/sample/jmh/StringKitAbs."":()V
<   #2 &#61; Class              #14            // org/agoncal/sample/jmh/StringKit
<   #3 &#61; Class              #15            // org/agoncal/sample/jmh/StringKitAbs
---
>    #1 &#61; Methodref          #3.#13         // org/agoncal/sample/jmh/StringKitAbsFinal."":()V
>    #2 &#61; Class              #14            // org/agoncal/sample/jmh/StringKitFinal
>    #3 &#61; Class              #15            // org/agoncal/sample/jmh/StringKitAbsFinal
19c19
<  #10 &#61; Utf8               Lorg/agoncal/sample/jmh/StringKit;
---
>   #10 &#61; Utf8               Lorg/agoncal/sample/jmh/StringKitFinal;
21c21
<  #12 &#61; Utf8               StringKit.java
---
>   #12 &#61; Utf8               StringKitFinal.java
23,24c23,24
<  #14 &#61; Utf8               org/agoncal/sample/jmh/StringKit
<  #15 &#61; Utf8               org/agoncal/sample/jmh/StringKitAbs
---
>   #14 &#61; Utf8               org/agoncal/sample/jmh/StringKitFinal
>   #15 &#61; Utf8               org/agoncal/sample/jmh/StringKitAbsFinal
26c26
<  public org.agoncal.sample.jmh.StringKit();
---
>   public org.agoncal.sample.jmh.StringKitFinal();
32c32
<         1: invokespecial #1                  // Method org/agoncal/sample/jmh/StringKitAbs."":()V
---
>          1: invokespecial #1                  // Method org/agoncal/sample/jmh/StringKitAbsFinal."":()V
38c38
<            0       5     0  this   Lorg/agoncal/sample/jmh/StringKit;
---
>             0       5     0  this   Lorg/agoncal/sample/jmh/StringKitFinal;
40c40
---
> SourceFile: "StringKitFinal.java"

可以看到&#xff0c;除了它们的方法签名和方法名字不同之外其他的都是一样的&#xff0c;包括JVM调用指令也完全是一样的。

结论

可以看到它们几乎是一样的。

总结

基于上面的基准测试结论&#xff0c;我认为滥用或刻意为了所谓的提升性能&#xff0c;而去为每一个方法尽可能添加 final 的关键字是不可取的。使用 final &#xff0c;更多的应该是根据Java对 final 的语义来定义&#xff0c;而不是只想着为了提升性能&#xff08;而且这影响可以忽略不计&#xff09;而刻意用 final.

使用 final 的情况:

final 变量: 表示只读&#xff08;只初始化一次&#xff0c;但可多次读取&#xff09; final 方法&#xff1a;表示子类不可以重写。&#xff08;网上认为 final 比非 final 快&#xff0c;就是认为它是在编译的时候已经静态绑定了&#xff0c;不需要在运行时再动态绑定。这个可能以前的JVM上是正确的&#xff0c;但在现代的JVM上&#xff0c;这个可以认为没什么影响&#xff0c;至少我在基准测试里是这样子&#xff09; final 类&#xff1a;它们不能被继承&#xff0c;而且final类的方法&#xff0c;默认也是 final 的。

关于这个 final 的性能问题&#xff0c;我也Google了下&#xff0c;发现 stackoverflow 上&#xff0c;也有类似的问题&#xff1a;

参考资料

https://www.javazhiyin.com/go?url&#61;https://stackoverflow.com/questions/4279420/does-use-of-final-keyword-in-java-improve-the-performance

End

扩展阅读

淘宝服务端高并发分布式架构演进之路

Java中关于try、catch、finally中的细节分析

7大绝招帮你轻轻松松提升MySQL性能

Spring注解&#64;Resource和&#64;Autowired区别对比

为什么说Redis是单线程的&#xff1f;

作者&#xff1a;emacsist

来源&#xff1a;https://emacsist.github.io/

640?wx_fmt&#61;jpeg


推荐阅读
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • 全面解析Java虚拟机:内存模型深度剖析 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 在Spring与Ibatis集成的环境中,通过Spring AOP配置事务管理至服务层。当在一个服务方法中引入自定义多线程时,发现事务管理功能失效。若不使用多线程,事务管理则能正常工作。本文深入分析了这一现象背后的潜在风险,并探讨了可能的解决方案,以确保事务一致性和线程安全。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
  • 深入理解Spark框架:RDD核心概念与操作详解
    RDD是Spark框架的核心计算模型,全称为弹性分布式数据集(Resilient Distributed Dataset)。本文详细解析了RDD的基本概念、特性及其在Spark中的关键操作,包括创建、转换和行动操作等,帮助读者深入理解Spark的工作原理和优化策略。通过具体示例和代码片段,进一步阐述了如何高效利用RDD进行大数据处理。 ... [详细]
  • 在启用分层编译的情况下,即时编译器(JIT)的触发条件涉及多个因素,包括方法调用频率、代码复杂度和运行时性能数据。本文将详细解析这些条件,并探讨分层编译如何优化JVM的执行效率。 ... [详细]
  • 深入解析Spring框架中的双亲委派机制突破方法
    在探讨Spring框架中突破双亲委派机制的方法之前,首先需要了解类加载器的基本概念。类加载器负责将类的全限定名转换为对应的二进制字节流。每个类在被特定的类加载器加载后,其唯一性得到保证。然而,这种机制在某些场景下可能会限制灵活性,因此Spring框架提供了一些策略来突破这一限制,以实现更加动态和灵活的类加载。这些策略不仅能够提升系统的可扩展性,还能在复杂的运行环境中确保类的正确加载和管理。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • Java 9 中 SafeVarargs 注释的使用与示例解析 ... [详细]
  • 探讨 `org.openide.windows.TopComponent.componentOpened()` 方法的应用及其代码实例分析 ... [详细]
  • Jedis接口分类详解与应用指南
    本文详细解析了Jedis接口的分类及其应用指南,重点介绍了字符串数据类型(String)的接口功能。作为Redis中最基本的数据存储形式,字符串类型支持多种操作,如设置、获取和更新键值对等,适用于广泛的应用场景。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
author-avatar
ab5212502902861
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有