优化代码-变量的优化(zt)

Zebra ZT410/ZT411打印机中文打印全攻略:从字体导入到ZPL指令配置 本文详细介绍了Zebra ZT410/ZT411打印机中文打印的完整解决方案,包括中文字体导入、ZPL指令配置和性能优化。通过实战案例展示如何高效处理中文标签打印,解决字体显示不全、乱码等问题,提升打印效率和质量。特别适用于物流仓储和零售行业的中文标签打印需求。 阅读详情

如果您频繁存取变量,就需要考虑从何处存取这些变量。变量是 static 变量,还是堆栈变量,或者是类的实例变量?变量的存储位置对存取它的代码的性能有明显的影响?例如,请考虑下面这段代码:

class StackVars
{
  private int instVar;
  private static int staticVar;
  
  //存取堆栈变量
  void stackAccess(int val)
  {
    int j=0;
    for (int i=0; i//存取类的实例变量
  void instanceAccess(int val)
  {
    for (int i=0; i //存取类的 static 变量
  void staticAccess(int val)
  {
    for (int i=0; i     

这段代码中的每个方法都执行相同的循环,并反复相同的次数。唯一的不同是每个循环使一个不同类型的变量递增。方法 stackAccess 使一个局部堆栈变量递增,instanceAccess 使类的一个实例变量递增,而 staticAccess 使类的一个 static 变量递增。

instanceAccess 和 staticAccess 的执行时间基本相同。但是,stackAccess 要快两到三倍。存取堆栈变量如此快是因为,JVM 存取堆栈变量比它存取 static 变量或类的实例变量执行的操作少。请看一下为这三个方法生成的字节码:

Method void stackAccess(int)
   0 iconst_0         //将 0 压入堆栈。
   1 istore_2         //弹出 0 并将它存储在局部分变量表中索引为 2 的位置 (j)。
   2 iconst_0         //压入 0。
   3 istore_3         //弹出 0 并将它存储在局部变量表中索引为 3 的位置 (i)。
   4 goto 13          //跳至位置 13。
   7 iinc 2 1         //将存储在索引 2 处的 j 加 1。
  10 iinc 3 1         //将存储在索引 3 处的 i 加 1。
  13 iload_3          //压入索引 3 处的值 (i)。
  14 iload_1          //压入索引 1 处的值 (val)。
  15 if_icmplt 7      //弹出 i 和 val。如果 i 小于 val,则跳至位置 7。
  18 return           //返回调用方法。
  
Method void instanceAccess(int)
   0 iconst_0         //将 0 压入堆栈。
   1 istore_2         //弹出 0 并将它存储在局部变量表中索引为 2 的位置 (i)。
   2 goto 18          //跳至位置 18。
   5 aload_0          //压入索引 0 (this)。
   6 dup              //复制堆栈顶的值并将它压入。
   7 getfield #19 
                      //弹出 this 对象引用并压入 instVar 的值。
  10 iconst_1         //压入 1。
  11 iadd             //弹出栈顶的两个值,并压入它们的和。
  12 putfield #19 
                      //弹出栈顶的两个值并将和存储在 instVar 中。
  15 iinc 2 1         //将存储在索引 2 处的 i 加 1。
  18 iload_2          //压入索引 2 处的值 (i)。
  19 iload_1          //压入索引 1 处的值 (val)。
  20 if_icmplt 5      //弹出 i 和 val。如果 i 小于 val,则跳至位置 5。
  23 return           //返回调用方法。
  
Method void staticAccess(int)
   0 iconst_0         //将 0 压入堆栈。
   1 istore_2         //弹出 0 并将它存储在局部变量表中索引为 2 的位置 (i)。
   2 goto 16          //跳至位置 16。
   5 getstatic #25 
                      //将常数存储池中 staticVar 的值压入堆栈。
   8 iconst_1         //压入 1。
   9 iadd             //弹出栈顶的两个值,并压入它们的和。
  10 putstatic #25 
                      //弹出和的值并将它存储在 staticVar 中。
  13 iinc 2 1         //将存储在索引 2 处的 i 加 1。
  16 iload_2          //压入索引 2 处的值 (i)。
  17 iload_1          //压入索引 1 处的值 (val)。
  18 if_icmplt 5      //弹出 i 和 val。如果 i 小于 val,则跳至位置 5。
  21 return           //返回调用方法。

查看字节码揭示了堆栈变量效率更高的原因。JVM 是一种基于堆栈的虚拟机,因此优化了对堆栈数据的存取和处理。所有局部变量都存储在一个局部变量表中,在 Java 操作数堆栈中进行处理,并可被高效地存取。存取 static 变量和实例变量成本更高,因为 JVM 必须使用代价更高的操作码,并从常数存储池中存取它们。(常数存储池保存一个类型所使用的所有类型、字段和方法的符号引用。)

通常,在第一次从常数存储池中访问 static 变量或实例变量以后,JVM 将动态更改字节码以使用效率更高的操作码。尽管有这种优化,堆栈变量的存取仍然更快。

考虑到这些事实,就可以重新构建前面的代码,以便通过存取堆栈变量而不是实例变量或 static 变量使操作更高效。请考虑修改后的代码:

class StackVars
{
  //与前面相同...
  void instanceAccess(int val)
  {
    int j = instVar;
    for (int i=0; i    

方法 instanceAccess 和 staticAccess 被修改为将它们的实例变量或 static 变量复制到局部堆栈变量中。当变量的处理完成以后,其值又被复制回实例变量或 static 变量中。这种简单的更改明显提高了 instanceAccess 和 staticAccess 的性能。这三个方法的执行时间现在基本相同,instanceAccess 和 staticAccess 的执行速度只比 stackAccess 的执行速度慢大约 4%。

这并不表示您应该避免使用 static 变量或实例变量。您应该使用对您的设计有意义的存储机制。例如,如果您在一个循环中存取 static 变量或实例变量,则您可以临时将它们存储在一个局部堆栈变量中,这样就可以明显地提高代码的性能。这将提供最高效的字节码指令序列供 JVM 执行。

避坑指南:斑马ZT410 RFID打印机C#开发那些坑——从驱动安装到ZPL指令调试 本文详细解析了斑马ZT410 RFID打印机在C#开发中的常见问题与解决方案,涵盖驱动安装、SDK引用、ZPL指令调试等关键环节。通过实战经验分享,帮助开发者避开USB连接不稳定、RFID写入失败、中文乱码等典型陷阱,提升开发效率与打印成功率。 阅读详情

相关推荐

斑马 ZT411 工业打印机驱动配置与 C# 打印避坑 5 要点

本文详细介绍了斑马ZT411工业打印机的驱动配置与C#打印开发实战指南,涵盖硬件连接、驱动调试、BarTender模板设计及C#集成开发等关键环节。特别针对工业环境中的常见问题,提供了实用的解决方案和性能优化技巧,帮助开发者高效实现标签打印系统的稳定运行。

weixin_33895657的博客 387

堆变量和栈变量

堆变量和栈变量       全局,静态,new产生的变量都在堆中 动态分配的变量在堆中分配     局部变量在栈里分配 函数中声明的变量在栈中     用了new标示符在堆中     全局变量和static变量都在全局区 程序为栈变量分配动态内存,在程序结束时为栈变量分配的空间将自动释放;而为堆变量分配的空间则不会自动释放,若在程序中

Wingene的专栏 1417

局部变量 全局变量 堆栈总结

堆栈(stack)是内存中的一个连续的块。一个叫堆栈指针的寄存器(SP)指向堆栈的栈顶。堆栈的底部是一个固定地址。堆栈有一个特点就是,后进先出。也就是说,后放入的数据第一个取出

堆和栈的区别,变量存储在哪,函数存储在哪

好基础的问题,居然没答上来 一、程序内存的角度 堆和栈是两种不同的存储结构 1.1 栈简介 栈由操作系统(编译器)自动分配释放释放空间,用于存放函数的参数值、局部变量 int main() { int a; //栈 char s[] = "str"; //栈 char *p2; //栈 } 函数中定义的局部变量按照先后定...

juji_1100的博客 4705

BSL编程语言 —— 系统化程序设计

BSL编程语言简介 文章目录0. 选择编程语言1. 写简单的表达式(Expression) 0. 选择编程语言 如果你第一次使用DrRacket,打开后需要选择Beginning Student Language (BSL) Language -> Choose Language (或直接按Ctrl + L),看到如下洁面后选择Beginning Student,点击OK 定义区【De...

CSDoneRight的博客 6450

深入解析JESD204B Periodic SYSREF在多ADC/DAC系统中的同步优化策略

本文深入探讨了JESD204B Periodic SYSREF在多ADC/DAC系统中的同步优化策略,针对雷达阵列和宽带通信系统中的同步精度问题,详细解析了硬件实现细节、参数配置实战经验及系统级优化方法。通过案例分析和技术要点,帮助工程师解决由温度漂移和时钟抖动引起的同步挑战,提升系统性能。

weixin_29267307的博客 137

堆变量&栈变量

全局,静态,new产生的变量都在堆中 动态分配的变量在堆中分配     局部变量在栈里分配 函数中声明的变量在栈中     用了new标示符在堆中     全局变量和static变量都在全局区 程序为栈变量分配动态内存,在程序结束时为栈变量分配的空间将自动释放;而为堆变量分配的空间则不会自动释放,若在程序中没有没有释放堆变量,它将一直占用系统内存。 堆栈是一种执行“后进先

6855

避坑指南:STM32F4的ADC采样FSR传感器,如何稳定读数并校准压力值?

本文详细解析了STM32F4的ADC采样FSR薄膜压力传感器时遇到的读数不稳定和非线性校准问题,提供了从硬件配置到软件滤波的完整解决方案。通过优化ADC设置、改进滤波算法和实施分段线性校准,帮助工程师实现高精度压力测量,特别适用于智能手套和医疗监测等应用场景。

weixin_28675839的博客 273

各种变量以及堆、栈的概念与实操

本文将通过在Ubuntu系统下和STM32单片机中,进行编程对全局变量、全局常量、局部变量、静态变量、堆、栈等进行重温与加深。

m0_74454099的博客 783

AWVS安装与使用教程

Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的自动化网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞。它可以扫描任何可通过Web浏览器访问的和遵循HTTP/HTTPS规则的Web站点和Web应用程序。适用于任何中小型和大型企业的内联网、外延网和面向客户、雇员、厂商和其它人员的Web网站。WVS可以通过检查SQL注入攻击漏洞、XSS跨站脚本攻击漏洞等漏洞来审核Web应用程序的安全性。

qq_59607911的博客 4098

DLMS—Cryptographic algorithms—(Green-Book)加密算法

密码学是数学的一个分支,基于数据的转换,并且可以用来提供多种安全服务:保密性、数据完整性、认证、授权和不可否认性。密码学依赖于两个基本组成部分:算法(或密码学方法)和密钥。算法是一个数学函数,而密钥是在转换过程中使用的参数。密码算法和密钥用于对数据应用密码保护(例如,加密数据或生成数字签名),以及移除或检查保护(例如,解密加密的数据或验证数字签名)。密码哈希函数:这类函数不需要密钥(尽管它们可以以使用密钥的模式使用)。哈希函数通常用作算法的一个组成部分,以提供安全服务。见9.2.3.2节。对称密钥算法。

一个bug是bug,多个bug能work 1708

C语言笔记----变量与堆栈

1.1.局部变量示例:123456789101112voidfunc() {intx10;//局部变量printf"x =%d\nxintmain() {func();//❌错误:x仅在func()内部可见return0;1.2.全局变量示例:12345678910111213intg_var100;//全局变量,默认初始化为100voidfunc() {

qq_46468829的博客 2133

C#读取CAD文件(dwg/dxf)并处理

项目要求识别CAD图纸(图纸内容与现实事物比例是1:1)中的内容,并提取出一些关键信息。这里的CAD图纸是指CAD文件,包含多种格式,dwg/dxf/dwf/stl/pdf等等。识别其中内容,主要指文件中的图元信息(也叫实体Entity),指线段、圆弧、矩形等图形元素。得到图元基础信息(比如长度、坐标、粗细)后,进一步做处理(如得到交点、得到线段间间隔、圆弧与线段切点等)。听起来有点难,因为作为软件工程师,对CAD相关事物并不了解,它是未知的;

三千幻想乡 1万+

zt指令c语言,zt:C++ 代码优化

该楼层疑似违规已被系统折叠隐藏此楼查看此楼谈到优化,很多人都会直接想到汇编。难道优化只能在汇编层次吗?当然不是,C++层次一样可以作代码优化,其中有些常常是意想不到的。在C++层次进行优化,比在汇编层次优化具有更好的移植性,应该是优化中的首选做法。确定浮点型变量和表达式是float型为了让编译器产生更好的代码(比如说产生3DNow!或SSE指令的代码),必须确定浮点型变量和表达式是flo...

weixin_39631932的博客 232

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库)

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库) 日志记录 默认情况下,所有 Sysrepo 日志记录都处于关闭状态。如果启用,日志消息有 3 种输出。它们可以写入stderr、由 处理syslog或简单地传递给回调。 请务必注意,启用 Sysrepo 日志记录也会修改libyang日志记录设置。错误消息被视为标准 Sysrepo 错误,其他严重性较低的消息完全隐藏。要更改此行为,只需在启用 Sysrepo 日志记录后调整libyang日志记录设置。 此外,几乎每个 Sysrepo

weixin_43489394的博客 9226

【STM32实物】基于STM32设计的智能仓储管理系统

近年来,随着我国仓储发展的和药品需求的不断增多,许多医院都采用药物仓储管理系统。我国的药物仓储产业已经有了长足的发展,仓库的规模不断变大,对仓储的要求也不断增高,药物的存储,识别以及对仓储环境条件的要求成为仓储的重要决策,他们可以根据不同的特点在不同场景中使用。本文详细介绍了一个基于单片机技术的智能仓储管理系统的设计与实现,这个系统可谓是集射频识别(RFID)技术和环境监测传感器于一身,旨在提高仓储操作的自动化和精确度。

嵌入式阿齐Archie 1万+

C++ 代码优化 (ZT)

C++ 代码优化 2002-06-04· ·龚敏敏··3322.net   谈到优化,很多人都会直接想到汇编。难道优化只能在汇编层次吗?当然不是,C++层次一样可以作代码优化,其中有些常常是意想不到的。在C++层次进行优化,比在汇编层次优化具有更好的移植性,应该是优化中的首选做法。   确定浮点型变量和表达式是 float 型   为了让编译器产生更好的代码(比如说产生3DNow! 或SSE指令的

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1164

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[zt]代码优化学习笔记

原文:http://www.cnblogs.com/techsunny/archive/2008/03/24/1120380.html 以下对程序性能优化的相关知识做了总结。应注意的是没有放之四海皆准的方法。1.策略1.1.最重要的原则:尽量少用代码优化(1) 相对于精细的代码优化,程序架构、数据结构、算法和细节设计更重要。(2) 不成熟的代码优化会危及程序的正确性、功能性和可维护性。(3

ljqy的专栏 880

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[ZT]网站优化之页面优化-重新整理

优化如何开始,怎么开始,以及做些什么还是值得思量的。 优化的一些准则: 1 优化是持续存在的,当你开始做一个功能的时候,优化就开始了。而我们往往认为新做的功能就是一个优化好的功能,殊不知这个功能或者会影响到其他的功能,或者先把功能做到70%,稍后再去优化也不迟。 2 不到万不得已的时候不要去优化。用户对于性能是有一定的忍耐性的,有时一个小小的加载图标就能让用户感到很满足的。 ...

banglvfei0870的博客 110

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

正确使用 Volatile 变量(ZT)

转载http://www.ibm.com/developerworks/cn/java/j-jtp06197.html Java 理论与实践: 正确使用 Volatile 变量volatile 变量使用指南 Brian Goetz (brian.goetz@sun.com), 高级工程师, Sun Microsystems Brian Goetz 作为一名专业软件开发人员已经 20 年...

xiao_jiang51 246

ZT Process Executor:简化Java进程管理的艺术

当你在Java中执行外部进程时,是否曾为选择哪种方法而困扰?`Runtime.exec()`、`ProcessBuilder`或者Apache Commons Exec?现在,让我们一起探索一个全新的解决方案——ZT Process Executor,它将这些功能统一在一个简洁的API之下,既保留了强大的特性,又带来了使用的便捷性。 ## 项目介绍 ZT Process Executor是Ze...

gitblog_00069的博客 634

老人言[ZT]

 《The Elements of Programming Style》是一本很古老的书,尽管新奇的语言层出不穷,但这些,30 年的岁月依旧无法掩盖其中的真知灼见。 •    把代码写清楚,别耍小聪明。 •    想干什么,讲的简单点、直接点。 •    只要有可能,使用库函数。 •    避免使用太多的临时变量。 •    “效率”不是牺牲清晰性的理由。 •    让机器去干那些脏活。 •   

jernymy的专栏 647

利用多核多线程进行程序优化[ZT]

级别: 中级 杨 小华 (normalnotebook@126.com), 软件工程师 2008 年 11 月 17 日 大家也许还记得 2005 年 3 月 C++ 大师 Herb Sutter 在 Dr.Dobb’s Journal 上发表了一篇名为《免费的午餐已经结束》的文章。文章指出:现在的程序员对效率、伸缩性、吞吐量等一系列性能指标相当忽视,很多性能问题都仰仗越来越快的 ...

diaoxian3971的博客 169

gdb基础zt

就调试本机可执行文件(即不是 Java* 或 perl 等)而言,使用 gdb 就对了。gdb 可用于源代码级调试,以及跟踪没有源代码的程序或检查某个终止的程序留下的核心文件。遗憾的是,当您从来没有使用过它,或者已经有一段时间没有使用它时,使用它来做这些工作可能很困难。图 1 展示了使用 gdb 来进行调试所需的每个命令。Command Descriptionfile load programb

蜗牛档案室 2440

如何阅读代码(ZT)

如何阅读代码(ZT)[ 2006-12-23 19:12:00 | By: Jean ] ++++++++++++第一章: 导论++++++++++++1.要养成一个习惯, 经常花时间阅读别人编写的高品质代码.2.要有选择地阅读代码, 同时, 还要有自己的目标. 您是想学习新的模式|编码风格|还

BLIZZARD--快乐、开心、游戏着~~ 623

ZT:Java代码编写的30条建议

类名、字段、方法以及对象的首字母的大小写;对于自己创建的每一个类,都考虑置入一个main();使类尽可能短小精悍; 让一切东西都尽可能地"私有";考虑采用内部类;尽可能细致地加上注释;需要时应创建一个常数;创建大小固定的对象集合时,使用数组;尽量使用interfaces,然后才是abstract类;在现成类的基础上创建新类时,请首先选择"新建"或"创作",然后才是继承;警...

weixin_34242331的博客 99
上一篇: Java中如何得到系统信息 (zt)
下一篇: Java语言中两种异常的差别(zt)
PerseusYan
博客等级 码龄23年 0粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值