优化 JavaScript

JavaScript性能优化实战- 第 1 篇:代码也要减肥 -JS 体积优化实战 打开页面要等 5 秒?你这是网页不是 PS 吧……”前端开发越来越重,动不动就几百 KB 的 JS 文件,用户一打开页面,浏览器都在默默崩溃。你以为是服务器慢,其实是你的 JS 太胖了。本篇就教你如何给 JS 减减肥,优化,让用户打开网页像喝冰可乐一样爽! 阅读详情

优化 JavaScript

下面是从《javascript高级编程》中摘录的:

下载时间

Web浏览器下载的是JavaScript源码,也就是所有的长变量与注释都会包含在内。这个因素和其他因素都会增加下载时间,这会增加脚本运行的 总时间。增加下载时间的关键因素就是脚本所包含的字节数。

要记住一个关键数字是1160,这是能放入单个TCP-IP包中的字节数。最好能将每个JavaScript文件都保持在1160字节以下以获取最 优的下载时间。

在JavaScript中,每个字符就是一个字节,因此,每个额外的字符(不管是变量名、函数名、或者注释)都会影响下载速度。部署 JavaScript之前,都应该尽可能优化下载速度。

1.删除注释

2.删除制表符和空格

3.删除所有的换行

4.替换变量名

5.ECMAScript Cruncher
利用Thomas Loo开发的ECMAScript Cruncher(ESC 可以http://www.saltstorm.net/depo/esc/ 或51AJAX.com 下载)。 ESC是一个小巧的Window Shell脚本。

利用Thomas Loo开发的ECMAScript Cruncher(ESC 可以下载)。ESC是一个小巧的Window Shell脚本。运行ESC,必须使用Windows系统。打开一个控制台窗口,输入以下命令:
cscript ESC.wsf -l [0-4] -ow outputfile.js inputfile.js [inputfile2.js]

第一部分,cscript是Windows Shell脚本解释程序。文件名ESC.wsf是ESC的程序本身。然后是压缩等级,一个0到4的数值,表示要进行优化的等级。-ow选项表示下一个参数 是优化后输出的文件名。最后,剩下的参数是要进行优化的JavaScript文件。可以只给出一个要进行优化的文件,也可以有多个文件(多个文件估优化后 会按顺序放到输出文件中)。

ESC支持的四个优化等级如下:
0:不改变脚本,要将多个文件合到单个文件中时有用;
1:删除所有的注释;
2:除等级1外,再删除额外的制表符和空格;
3:除等级2外,再删除换行;
4:除等级3外,再进行变量名替换。

ESC擅长把变量名替换成无意义的名称。它不会更改构造名称、公用特性和公用方法名称。

使用ESC时要记住,如果某个JavaScript引用了另一个文件中的构造函数,4级优化会把对构造函数的引用替换成无意义的名称。解决方法是将 两个文件合并成一个文件,这样就会保持构造函数的名称。

6.其他减少字节数的方法
1)替换布尔值
  考虑下面的例子

varbFound=false
;
 
for
(var
 i=0;i<aTest.length;i++){
 
if
(aTest[i]==vTest) {bFound=true
;}
 
}
 

可以替换为: 

varbFound=0;
for
(var
 i=0;i if
(aTest[i]==vTest) {bFound=1;}
 }

   2)缩短否定检测

if
(oTest !=#ff0000) {
//do something
}
if
(oTest !=null
) {
//do something
}
if
(oTest !=false
) {
//do something
}

  虽然这些都正确,但用逻辑非操作符来操作也有同样的效果

if
(!oTest) {
//do something
}

7.使用数组和对象字面量

varaTest = new
 Array;
var
 aTest =[];

第二行用了数组字面量,与第一行效果一样,但要短很多。

  类似,对象字面量也可用于节省空间,以下两行效果一行,但对象字面量要更简短

varaTest = new
 Object;
var
 aTest ={}; 

 如果要创建具有一些特性的一般对象,也可以使用字面量,如下:

varoFruit = new
 O;
oFruit.color="red"
;
oFruit.name="apple"
; 

  前面的代码可用对象字面量来改写成这样:

varoFruit = {color:"red"
,name:"apple"
};

一.执行效率


1. DOM


1.1 使用DocumentFragment优化多次append


说明:添加多个dom元素时,先将元素append到DocumentFragment中,最后统一将DocumentFragment添加到页面。
该做法可以减少页面渲染dom元素的次数。经IE和Fx下测试,在append1000个元素时,效率能提高10%-30%,Fx下提升较为明显。


服用前:


for (var i = 0; i < 1000; i++) {
    var el = document.createElement('p');
    el.innerHTML = i;
    document.body.appendChild(el);
}


服用后:


var frag = document.createDocumentFragment();
for (var i = 0; i < 1000; i++) {
    var el = document.createElement('p');
    el.innerHTML = i;
    frag.appendChild(el);
}
document.body.appendChild(frag);


1.2 通过模板元素clone,替代createElement


说明:通过一个模板dom对象cloneNode,效率比直接创建element高。
性能提高不明显,约为10%左右。在低于100个元素create和append操作时,没有优势。


服用前:


var frag = document.createDocumentFragment();
for (var i = 0; i < 1000; i++) {
    var el = document.createElement('p');
    el.innerHTML = i;
    frag.appendChild(el);
}
document.body.appendChild(frag);   


服用后:


var frag = document.createDocumentFragment();
var pEl = document.getElementsByTagName('p')[0];
for (var i = 0; i < 1000; i++) {
    var el = pEl.cloneNode(false);
    el.innerHTML = i;
    frag.appendChild(el);
}
document.body.appendChild(frag);


1.3 使用一次innerHTML赋值代替构建dom元素


说明:根据数据构建列表样式的时候,使用设置列表容器innerHTML的方式,比构建dom元素并append到页面中的方式,效率有数量级上的提高。


服用前:


var frag = document.createDocumentFragment();
for (var i = 0; i < 1000; i++) {
    var el = document.createElement('p');
    el.innerHTML = i;
    frag.appendChild(el);
}
document.body.appendChild(frag);


服用后:


var html = [];
for (var i = 0; i < 1000; i++) {
    html.push('<p>' + i + '</p>');
}
document.body.innerHTML = html.join('');


1.4 使用firstChild和nextSibling代替childNodes遍历dom元素


说明:约能获得30%-50%的性能提高。逆向遍历时使用lastChild和previousSibling。


服用前:


var nodes = element.childNodes;
for (var i = 0, l = nodes.length; i < l; i++) {
var node = nodes[i];
……
}


服用后:


var node = element.firstChild;
while (node) {
……
node = node.nextSibling;
}


2. 字符串

2.1 使用Array做为StringBuffer,代替字符串拼接的操作


说明:IE在对字符串拼接的时候,会创建临时的String对象;经测试,在IE下,当拼接的字符串越来越大时,运行效率会急剧下降。Fx和Opera都 对字符串拼接操作进行了优化;经测试,在Fx下,使用Array的join方式执行时间约为直接字符串拼接的1.4倍。


服用前:


var now = new Date();
var str = '';
for (var i = 0; i < 10000; i++) {
    str += '123456789123456789';
}
alert(new Date() - now);


服用后:


var now = new Date();
var strBuffer = [];
for (var i = 0; i < 10000; i++) {
    strBuffer.push('123456789123456789');
}
var str = strBuffer.join('');
alert(new Date() - now);


3. 循环语句


3.1 将循环控制量保存到局部变量


说明:对数组和列表对象的遍历时,提前将length保存到局部变量中,避免在循环的每一步重复取值。


服用前:


var list = document.getElementsByTagName('p');
for (var i = 0; i < list.length; i++) {
    ……
}


服用后:


var list = document.getElementsByTagName('p');
for (var i = 0, l = list.length; i < l; i++) {
    ……
}


3.2 顺序无关的遍历时,用while替代for


说明:该方法可以减少局部变量的使用。比起效率优化,更能直接看到的是字符数量的优化。该做法有程序员强迫症的嫌疑。


服用前:


var arr = [1,2,3,4,5,6,7];
var sum = 0;
for (var i = 0, l = arr.length; i < l; i++) {
    sum += arr[i];
}   


服用后:


var arr = [1,2,3,4,5,6,7];
var sum = 0, l = arr.length;
while (l--) {
    sum += arr[l];
}


4. 条件分支


4.1 将条件分支,按可能性顺序从高到低排列


说明:可以减少解释器对条件的探测次数。


4.2 在同一条件子的多(>2)条件分支时,使用switch优于if


说明:switch分支选择的效率高于if,在IE下尤为明显。4分支的测试,IE下switch的执行时间约为if的一半。


4.3 使用三目运算符替代条件分支


服用前:


if (a > b) {
num = a;
} else {
num = b;
}


服用后:


num = a > b ? a : b;


5. 定时器


5.1 需要不断执行的时候,优先考虑使用setInterval


说明:setTimeout每一次都会初始化一个定时器。setInterval只会在开始的时候初始化一个定时器


服用前:


var timeoutTimes = 0;
function timeout () {
    timeoutTimes++;
    if (timeoutTimes < 10) {
        setTimeout(timeout, 10);
    }
}
timeout();


服用后:


var intervalTimes = 0;
function interval () {
    intervalTimes++;
    if (intervalTimes >= 10) {
        clearInterval(interv);
    }
}
var interv = setInterval(interval, 10);


5.2 使用function而不是string


说明:如果把字符串作为setTimeout和setInterval的参数,浏览器会先用这个字符串构建一个function。


服用前:


var num = 0;
setTimeout('num++', 10);   


服用后:


var num = 0;
function addNum () {
    num++;
}
setTimeout(addNum, 10);


6. 其他


6.1 尽量不使用动态语法元素


说明:eval、Function、execScript等语句会再次使用javascript解析引擎进行解析,需要消耗大量的执行时间。


6.2 重复使用的调用结果,事先保存到局部变量


说明:避免多次取值的调用开销。


服用前:


var h1 = element1.clientHeight + num1;
var h2 = element1.clientHeight + num2;


服用后:


var eleHeight = element1.clientHeight;
var h1 = eleHeight + num1;
var h2 = eleHeight + num2;


6.3 使用直接量


说明:
var a = new Array(param,param,...) -> var a = []
var foo = new Object() -> var foo = {}
var reg = new RegExp() -> var reg = /.../


6.4 避免使用with


说明: with虽然可以缩短代码量,但是会在运行时构造一个新的scope。
OperaDev上还有这样的解释,使用with语句会使得解释器无法在语法解析阶段对代码进行优化。对此说法,无法验证。


服用前:


with (a.b.c.d) {
property1 = 1;
property2 = 2;
}


服用后:


var obj = a.b.c.d;
obj.property1 = 1;
obj.property2 = 2;


6.5 巧用||和&&布尔运算符


重要程度:★★★
服用前:


function eventHandler (e) {
if(!e) e = window.event;
}


服用后:


function eventHandler (e) {
e = e || window.event;
}


服用前:


if (myobj) {
doSomething(myobj);
}


服用后:


myobj && doSomething(myobj);


6.6 类型转换


说明:
1).    数字转换成字符串,应用"" + 1,性能上:("" +) > String() > .toString() > new String();
2).    浮点数转换成整型,不使用parseInt(), parseInt()是用于将字符串转换成数字,而不是浮点数和整型之间的转换,建议使用Math.floor()或者Math.round()
3).    对于自定义的对象,推荐显式调用toString()。内部操作在尝试所有可能性之后,会尝试对象的toString()方法尝试能否转化为 String。

二.内存管理


2.1 循环引用


说明:如果循环引用中包含DOM对象或者ActiveX对象,那么就会发生内存泄露。内存泄露的后果是在浏览器关闭前,即使是刷新页面,这部分内存不会被 浏览器释放。


简单的循环引用:


var el = document.getElementById('MyElement');
var func = function () {…}
el.func = func;
func.element = el;


但是通常不会出现这种情况。通常循环引用发生在为dom元素添加闭包作为expendo的时候。
如:


function init() {

    var el = document.getElementById('MyElement');
el.onclick = function () {……}
}
init();


init在执行的时候,当前上下文我们叫做context。这个时候,context引用了el,el引用了function,function引用了 context。这时候形成了一个循环引用。
下面2种方法可以解决循环引用:


1)    置空dom对象


服用前:


function init() {
var el = document.getElementById('MyElement');
el.onclick = function () {……}
}
init();


服用后:


function init() {
var el = document.getElementById('MyElement');
el.onclick = function () {……}
el = null;
}


init();


将el置空,context中不包含对dom对象的引用,从而打断循环应用。
如果我们需要将dom对象返回,可以用如下方法:


服用前:


function init() {
    var el = document.getElementById('MyElement');
    el.onclick = function () {……}
    return el;
}
init();


服用后:


function init() {
var el = document.getElementById('MyElement');
el.onclick = function () {……}
try{
return el;
} finally {
    el = null;
}
}
init();


2)    构造新的context


服用前:


function init() {
    var el = document.getElementById('MyElement');
    el.onclick = function () {……}
}
init();


服用后:


function elClickHandler() {……}
function init() {
    var el = document.getElementById('MyElement');
    el.onclick = elClickHandler;
}
init();


把function抽到新的context中,这样,function的context就不包含对el的引用,从而打断循环引用。


2.2 通过javascript创建的dom对象,必须append到页面中


说明:IE下,脚本创建的dom对象,如果没有append到页面中,刷新页面,这部分内存是不会回收的!
示例代码:
    function create () {
        var gc = document.getElementById('GC');
        for (var i = 0; i < 5000 ; i++)
        {
            var el = document.createElement('div');
            el.innerHTML = "test";
            //下面这句可以注释掉,看看浏览器在任务管理器中,点击按钮然后刷新后的内存变化
            gc.appendChild(el);
        }
    }


2.3 释放dom元素占用的内存


说明:
将dom元素的innerHTML设置为空字符串,可以释放其子元素占用的内存。
在rich应用中,用户也许会在一个页面上停留很长时间,可以使用该方法释放积累得越来越多的dom元素使用的内存。


2.4 释放javascript对象


说明:在rich应用中,随着实例化对象数量的增加,内存消耗会越来越大。所以应当及时释放对对象的引用,让GC能够回收这些内存控件。
对象:obj = null
对象属性:delete obj.myproperty
数组item:使用数组的splice方法释放数组中不用的item


2.5 避免string的隐式装箱


说明:对string的方法调用,比如'xxx'.length,浏览器会进行一个隐式的装箱操作,将字符串先转换成一个String对象。推荐对声明有 可能使用String实例方法的字符串时,采用如下写法:
var myString = new String('Hello World');

 

语言相关:

循环

 

循环是很常用的一个控制结构,大部分东西要依靠它来完成,在JavaScript中,我们可以使用for(;;),while(),for(in) 三种循环,事实上,这三种循环中for(in)的效率极差,因为他需要查询散列键,只要可以,就应该尽量少用。for(;;)和while循 环,while循环的效率要优于for(;;),可能是因为for(;;)结构的问题,需要经常跳转回去。

 
局部变量和全局变量

局部变量的速度要比全局变量的访问速度更快,因为全局变量其实是全局对象的成员,而局部变量是放在函数的栈当中的。

 

不使用Eval

使用eval相当于在运行时再次调用解释引擎对内容进行运行,需要消耗大量时间。这时候使用JavaScript所支持的闭包可以实现函数模版(关 于闭包的内容请参考函数式编程的有关内容)

 

减少对象查找

因为JavaScript的解释性,所以a.b.c.d.e,需要进行至少4次查询操作,先检查a再检查a中的b,再检查b中的c,如此往下。所以 如果这样的表达式重复出现,只要可能,应该尽量少出现这样的表达式,可以利用局部变量,把它放入一个临时的地方进行查询。

这一点可以和循环结合起来,因为我们常常要根据字符串、数组的长度进行循环,而通常这个长度是不变的,比如每次查询a.length,就要额外进行 一个操作,而预先把var len=a.length,则就少了一次查询。

 

字符串连接

如果是追加字符串,最好使用s+=anotherStr操作,而不是要使用s=s+anotherStr。

如果要连接多个字符串,应该少使用+=,如

s+=a;

s+=b;

s+=c;

应该写成s+=a + b + c;

而如果是收集字符串,比如多次对同一个字符串进行+=操作的话,最好使用一个缓存。怎么用呢?使用JavaScript数组来收集,最后使用 join方法连接起来,如下

var buf = new Array();

for(var i = 0; i < 100; i++){

buf.push(i.toString());

}

var all = buf.join("");

 

类型转换

类型转换是大家常犯的错误,因为JavaScript是动态类型语言,你不能指定变量的类型。

1. 把数字转换成字符串,应用"" + 1,虽然看起来比较丑一点,但事实上这个效率是最高的,性能上来说:

("" +) > String() > .toString() > new String()

这条其实和下面的“直接量”有点类似,尽量使用编译时就能使用的内部操作要比运行时使用的用户操作要快。

String()属于内部函数,所以速度很快,而.toString()要查询原型中的函数,所以速度逊色一些,new String()用于返回一个精确的副本。

2. 浮点数转换成整型,这个更容易出错,很多人喜欢使用parseInt(),其实parseInt()是用于将字符串转换成数字,而不是浮点数和整型之间的 转换,我们应该使用Math.floor()或者Math.round()。

另外,和第二节的对象查找中的问题不一样,Math是内部对象,所以Math.floor()其实并没有多少查询方法和调用的时间,速度是最快的。

3. 对于自定义的对象,如果定义了toString()方法来进行类型转换的话,推荐显式调用toString(),因为内部的操作在尝试所有可能性之后,会 尝试对象的toString()方法尝试能否转化为String,所以直接调用这个方法效率会更高

 

使用直接量

其实这个影响倒比较小,可以忽略。什么叫使用直接量,比如,JavaScript支持使用[param,param,param,...]来直接表 达一个数组,以往我们都使用new Array(param,param,...),使用前者是引擎直接解释的,后者要调用一个Array内部构造器,所以要略微快一点点。

同样,var foo = {}的方式也比var foo = new Object();快,var reg = /../;要比var reg=new RegExp()快。

 

字符串遍历操作

对字符串进行循环操作,譬如替换、查找,应使用正则表达式,因为本身JavaScript的循环速度就比较慢,而正则表达式的操作是用C写成的语言 的API,性能很好。

 
高级对象

自定义高级对象和Date、RegExp对象在构造时都会消耗大量时间。如果可以复用,应采用缓存的方式。

 

DOM相关:

插入HTML

很多人喜欢在JavaScript中使用document.write来给页面生成内容。事实上这样的效率较低,如果需要直接插入HTML,可以找 一个容器元素,比如指定一个div或者span,并设置他们的innerHTML来将自己的HTML代码插入到页面中。

 

对象查询

使用[“”]查询要比.items()更快,这和前面的减少对象查找的思路是一样的,调用.items()增加了一次查询和函数的调用。

 

创建DOM节点

通常我们可能会使用字符串直接写HTML来创建节点,其实这样做

  1. 无法保证代码的有效性

  2. 字符串操作效率低

所以应该是用document.createElement()方法,而如果文档中存在现成的样板节点,应该是用cloneNode()方法,因为 使用createElement()方法之后,你需要设置多次元素的属性,使用cloneNode()则可以减少属性的设置次数——同样如果需要创建很多 元素,应该先准备一个样板节点。

 

定时器

如果针对的是不断运行的代码,不应该使用setTimeout,而应该是用setInterval。setTimeout每次要重新设置一个定时 器。

 

其他:

脚本引擎

据我测试Microsoft的JScript的效率较Mozilla的Spidermonkey要差很多,无论是执行速度还是内存管理上,因为 JScript现在基本也不更新了。但SpiderMonkey不能使用ActiveXObject

 

文件优化

文件优化也是一个很有效的手段,删除所有的空格和注释,把代码放入一行内,可以加快下载的速度,注意,是下载的速度而不是解析的速度,如果是本地, 注释和空格并不会影响解释和执行速度。

 

批量增加 Dom

尽量使用修改innerHTML的方式而不是用appendChild的方式; 因为使用innerHTML开销更小,速度更快,同时也更加内存安全.

有一点需要注意的是,用innerHTML方式添加时,一定不要在循环中使用 innerHTML += 的方式添加,这样反而会使速度减慢; 而是应该中间用array缓存起来,循环结束后调用 xx.innerHTML = array.join(‘’);的方式,或者至少保存到string中再插到innerHTML中.

针对用户列表一块采用这种方式优化后,加载速度提升一倍.

 

单个增加 Dom

这里是指要将新节点加载到一个内容不断变化的节点的情形,对于内容稳定的节点来说,随便怎么加都没有问题. 但是对于有动态内容的节点来说,为其添加子节点尽量使用 dom append的方式.

这是因为,dom append不会影响到其他的节点;而如果修改innerHTML属性的话,该父节点的所有子节点都会从dom树中剥离,再根据新的innerHTML值 来重绘子节点dom树;所有注册到原来子节点的事件也会失效.

综上,如果在一个有动态内容的节点上 出现了 innerHTML += 的代码,就该考虑是否有问题了.

 

创建 Dom 节点

用createElement方式创建一个dom节点,有一个很重要的细节: 在执行完createElement代码之后,应该马上append到dom树中; 否则,如果在将这个孤立节点加载到dom树之前所做的赋值它的属性和innerHTML的操作都会引发该dom片段内存无法回收的问题. 这个不起眼细节,一旦遇到大量dom增删操作,就会引发内存的灾难.

 

删除 Dom 节点

删除dom节点之前,一定要删除注册在该节点上的事件,不管是用observe方式还是用attachEvent方式注册的事件,否则将会产生无法 回收的内存.

另,在removeChild和innerHTML=’’二者之间,尽量选择后者. 因为在sIEve(内存泄露监测工具)中监测的结果是用removeChild无法有效地释放dom节点.

 

创建事件监听

现有的js库都采用observe方式来创建事件监听,其实现上隔离了dom对象和事件处理函数之间的循环引用,所以应该尽量采用这种方式来创建事 件监听.

 

监听动态元素

Dom事件默认是向上冒泡的,发生在子节点中的事件,可以由父节点来处理. Event的 target/srcElement 仍是产生事件的最深层子节点. 这样,对于内容动态增加并且子节点都需要相同的事件处理函数的情况,可以把事件注册上提到父节点上,这样就不需要为每个子节点注册事件监听了.

同时,这样做也避免了产生无法回收的内存.即使是用Prototype的observe方式注册事件并在删除节点前调用 stopObserving,也会产生出少量无法回收的内存,所以应该尽量少的为dom节点注册事件监听.

所以,当代码中出现在循环里注册事件时,也是我们该考虑事件上提机制的时候了.

 

HTML 提纯

HTML提纯体现的是一种各负其责的思想. HTML只用来显示,尽量不出现和显示无关的属性.比如onclick事件,比如自定义的对象属性.

事件可以用前面的方法避免, 对象属性指的是这样的一种情景: 通常情况下,动态增加的内容都是有个对象和它对应,比如聊天室的用户列表,每个显示用户的dom节点都有一个user对象和它对应,这样在html中,应 该仅保留一个id属性和user对象对应,而其他的信息,则应通过user对象去获取.

 

另外注意:JavaScript在IE下的内存泄漏问题,详情见msdn:http://msdn.microsoft.com/en-us/library/bb250448.aspx

JavaScript性能优化实战:优化JS性能问题实战 摘要:文章深入探讨JavaScript性能优化策略,分析重绘/重排、主线程阻塞、内存泄漏三大性能瓶颈,并提供实战优化方案:通过减少DOM操作、应用节流防抖技术、实现资源懒加载、利用WebWorker分担计算及数据缓存等方法提升性能。结合新闻网站优化案例,展示这些技巧的实际效果,最终总结持续性能监控和优化的最佳实践,帮助开发者构建高效Web应用。 阅读详情

相关推荐

Next.js 脚本优化:高效加载 JavaScript

Next.js 作为一个基于 React 的全栈框架,在处理 JavaScript 脚本加载时提供了强大的优化工具,其中 next/script 组件是关键功能之一。脚本加载是 Web 应用性能的核心,传统next/script 组件在 App Router 和 Pages Router 中均可用,支持 beforeInteractive、afterInteractive 和 lazyOnLoad 等策略,允许开发者根据场景优化加载时机。本文将探讨 next/script 组件及脚本加载策略,详细讲解其

zimin的专栏 1466

浅谈内存泄漏

在JavaScript中,内存泄漏是指应用程序在不再需要使用某块内存时仍然保持对其的引用,导致内存不能被垃圾回收机制释放,最终导致内存占用过高,性能下降。

zzsan的博客 535

混合开关电容DCDC变换器技术解析与工程应用指南

在电源设计领域,传统DCDC变换器在高降压比或高升压比场景下,往往面临占空比过窄、开关应力大、效率偏低等瓶颈。开关电容变换器虽能实现固定比例的电压变换,却受限于调节能力。混合开关电容DCDC变换器通过“开关电容网络粗调变比+电感式DCDC细调输出”的策略,兼顾高效率、高功率密度与宽调压范围。本文梳理了其典型拓扑(如2:1/4:1 SC+Buck)、关键对比、控制策略(含软充电)及工程应用中的常见问题,帮助电源工程师在服务器供电、快充、车载电源等场景下快速选型与调试。

weixin_29164185的博客 314

到底怎样才算泄露?

暂且认为:如果在浏览器刷新之前, 内存可以被回收,才算不泄露。 规则1:创建的元素,如果包含内联脚本(这是这条规则的前提情况),一定要挂载在dom树上!不能先挂载到不在树上的元素! 如果不包含内联脚本对象, 则不会泄露。 如果包含了内联脚本,则记得先挂在树上~ 哈哈也就是先把父节点挂载,然后挂载子节点到父节点. 再者说来,在FF等其他浏览器中,根本不允许 document.crea

gangzai的专栏 795

5.4 磁悬浮轴承控制系统仿真:在MATLAB/Simulink中搭建包含功放、传感器模型的闭环系统模型,进行稳定性与动态性能仿真

磁悬浮轴承控制系统仿真方法 摘要:磁悬浮轴承控制系统仿真需建立包含转子动力学、传感器、控制器、功率放大器和电磁执行器的高保真非线性模型。通过MATLAB/Simulink搭建闭环系统,重点建模传感器带宽限制与噪声、功放饱和特性以及电磁力非线性。仿真分析包括时域阶跃响应、扰动抑制测试,频域稳定性分析(伯德图、奈奎斯特图),以及参数摄动下的鲁棒性验证。关键要验证控制算法在非线性因素影响下的稳定性和动态性能,为实际系统实现提供可靠依据。仿真中需特别注意物理量单位一致性和数字控制离散化效应。

技术工作者 1108

IC面试常考题 Verilog三分频电路设计(占空比50%,三分之一,三分之二)

实现三分频电路最简单的是: 利用计数器实现。 时序图分析(本人比较懒,平常科研忙,所以直接手画时序图了,懒得用软件画了): 直接上图分析:利用计数器每隔三个周期信号翻转一次,同时在不同的计数下翻转得到的同步信号 clk_1和clk_2,再利用异或即可实现出一个不同占空比的三分频信号(同样的方法也可扩展到其他奇数分频设计中)。 例如占空比50%: module Div_three( input clk, input rst_n, output div_three ); reg

qq_41884662的博客 1万+

DOM的createElement的坑

&lt;body&gt; &lt;div&gt; &lt;p id="p1"&gt;p1&lt;/p&gt; &lt;p id="p2"&gt;p2&lt;/p&gt; &lt;p id="p3"&gt;p3&lt;/p&gt; &lt;/div&am

肉嘟嘟的博客 2109

西门子1500 PLC与巴鲁夫RFID实战:从硬件接线到数据读写的完整流程

本文详细介绍了西门子S7-1500 PLC与巴鲁夫RFID系统集成的完整实战流程。内容涵盖从硬件选型、接线、PROFINET网络配置,到在TIA Portal中安装GSD文件、组态设备、分配地址,再到使用标准功能块(如FB31)进行程序架构设计、实现数据读写以及错误诊断。文章重点分享了硬件连接要点、软件配置步骤、数据块管理技巧以及调试中常见问题的解决方案,为工业自动化工程师实施RFID项目提供了清晰的指导。

weixin_29161785的博客 386

document节点创建页面元素

1.createElement()方法 描述:本方法用来在内存中创建一个页面元素 语法:var 变量名 = document.createElement("标签名"); 注意:本方法创建的页面元素并不会直接显示在页面中,而是默认存在于内存中 兼容性:五大主流浏览器都支持 2.createTextNode()方法 描述:本方法可创建文本节点 语法:var 变量名 = document.createTextNode(text); 兼容性:五大主流浏览器都...

不甜呐的博客 3540

国产FPGA逆袭!深度评测复旦微RFVU3P5G核心板在相控阵雷达中的表现

本文深度评测了复旦微RFVU3P5G核心板在相控阵雷达中的实战表现。该核心板凭借射频直采架构、高采样率ADC/DAC及丰富的DSP资源,在多通道同步精度、动态范围及系统稳定性等关键指标上表现出色,展现了国产FPGA在高端雷达应用中的硬核实力与供应链自主价值。

b0c1d2的博客 724

用 CL_HTTP_CLIENT 正确处理 Cookie,彻底解决 SAP Gateway OData 的 CSRF Token 校验失败

SAP OData 集成中 CSRF Token 校验失败的解决方案 问题现象:使用 Postman 测试 OData 写入成功,但 ABAP 代码调用时出现 CSRF token validation failed 错误。 根本原因:Postman 自动处理 Cookie,而 ABAP 代码仅获取了 CSRF Token 却遗漏了 Cookie 信息。SAP Gateway 要求修改请求必须同时携带 Token 和 Cookie 才能通过校验。 解决方案: 通过 GET 请求同时获取 CSRF Token

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 433

JS的内存管理

对于JavaScript来说,会在创建变量(对象,字符串等)时分配内存,并且在不再使用它们时“自动”释放内存,这个自动释放内存的过程称为垃圾回收。 因为自动垃圾回收机制的存在,让大多Javascript开发者感觉他们可以不关心内存管理,所以会在一些情况下导致内存泄漏。不管什么样的编程语言,在代码的执行过程中都是需要给它分配内存的,不同的是某些编程语言需要我们自己手动的管理内存,某些编程语言会可以自动帮助我们管理内存:不管以什么样的方式来管理内存,内存的管理都会有如下的生命周期:不同的编程语言对于第一步和第三

浮游的博客 1532

化工设备设计软件:PVELITE二次开发_(12).数据导入导出与兼容性

在数据导入之前,需要定义数据在PVELITE中的结构。可以通过编程接口定义字段名称和数据类型。# 导入必要的库 import pvelite # 创建PVELITE实例 pve = pvelite . PVELITE() # 定义CSV数据结构 csv_structure = {

kkchenjj的博客 1216

如何优化网页JavaScript性能:优化JS性能问题实战

如何优化网页JavaScript性能:优化JS性能问题实战 一、引言 在现代Web开发中,JavaScript是构建交互式网页应用的核心。然而,随着前端应用的复杂性提升,JavaScript性能问题逐渐成为影响用户体验的关键因素。本文将深入探讨JavaScript性能瓶颈的来源,结合实践案例,分享一系列行之有效的优化技巧与最佳实践,帮助开发者打造高性能、响应迅速的Web应用。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 1万+

Android 车载开发深度解析:CarPropertyManager 核心机制与实践指南

摘要: Android Automotive OS中,CarPropertyManager作为车载信息娱乐系统的核心组件,连接应用层与车辆硬件(如车速、油量等),其架构基于分层设计(App→CarAPI→VHAL→ECU),采用发布-订阅模式实现高效数据通信。通过HIDL/AIDL跨进程交互及共享内存优化,延迟可降至2ms以下。安全机制包括分级权限控制(VISIBLE/PROTECTED/SYSTEM_RESTRICTED)和HMAC防篡改。开发时需注意监听器生命周期管理、事件合并降负载及低功耗适配。

郑伟强dev的专栏 344

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

从JS引擎理解并优化javascript代码

序言:作为一名前端工程师,对于javascript大家都不陌生,这篇文章从更深层次的方向——JS引擎去理解javascript到底是怎么运行的,从而进行优化。 JS Engine—— JS 引擎介绍 一、基本介绍 js引擎是一个专门运行javascript的解释器(interpreter)。目前比较主流的js 引擎和介绍,大家可以简单了解一下: V8 —  由谷歌使用C++开源的V8引擎,...

likeconan123的博客 2974

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

推荐文章:优化你的JavaScript —— 深入了解`optimize-js-plugin`

推荐文章:优化你的JavaScript —— 深入了解optimize-js-plugin 在前端开发的高效性和性能追求之旅中,我们总是寻求那些能够提升应用加载速度和运行效率的魔法工具。今天,我们将探索一款旨在优化你的Webpack构建流程的神器——optimize-js-plugin。 项目介绍 optimize-js-plugin是一个轻量级的Webpack插件,其核心目标是通过集成Nolan...

gitblog_00695的博客 986

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

css js 性能优化,JavaScript前端性能优化

JS性能优化的知识非常庞杂,这里我们来介绍几种常用的性能优化方式。一、JS中的前端性能优化原则:多使用内存、缓存等方法减少CPU计算、减少网络请求二、针对上述两项原则,我们可以从两个方向入手来进行前端的性能优化。1、加载资源优化静态资源的压缩合并我们可以利用webpack等打包工具进行资源的合并与压缩操作,可以大大减小资源的大小,实现页面更快的加载。静态资源缓存当浏览器发送请求时,可以检测该资源的...

weixin_33487811的博客 509

【JS】JavaScript 优化技巧

JavaScript 性能优化技巧

one-ccs 的博客 388

Webpack插件:JavaScript文件优化工具——Optimize-js-plugin

Webpack插件:JavaScript文件优化工具——Optimize-js-plugin Optimize-js-plugin 是一个开源的 Webpack 插件,它旨在通过包装急切调用的函数来优化 JavaScript 文件,从而加快初始加载速度。该项目主要使用 JavaScript 编程语言。 项目核心功能 Optimize-js-plugin 的核心功能是通过 Webpack 插件机制,...

gitblog_00916的博客 478

推荐使用:optimize-js-plugin - Webpack 的高效 JavaScript 优化插件

推荐使用:optimize-js-plugin - Webpack 的高效 JavaScript 优化插件 在构建现代 web 应用的过程中,性能优化是至关重要的环节。今天,我们向您推荐一款基于 optimize-js 的优秀 Webpack 插件 —— optimize-js-plugin。这个小巧却强大的工具能够显著提升你的 JavaScript 文件的加载速度和运行效率。 1. 项目介绍 o...

gitblog_00026的博客 855

js和java 性能优化,JavaScript性能优化

1、使用局部变量在函数中,总是使用var来定义变量。无论何时使用var都会在当前的范围类创建一个局部变量。如果不使用var来定义变量,那么变量会被创建在window范围内,那么每次使用这个变量的时候,解释程序都会搜索整个范围树。同时全局变量要在页面从浏览器中卸载后才销毁,而局部变量在函数执行完毕即可销毁,过多的全局变量增加了不必要的内存消耗。只要有可能就应该用局部变量或者数字索引的数组来替代命名特...

weixin_36193690的博客 3383

JavaScript性能优化篇js优化

http://www.111cn.net/wy/js-ajax/43542.htm JavaScript性能优化篇js优化 我在本文中将指出一些重要的规则,介绍如何使用你的JavaScript、使用哪些工具以及你将从中得到什么好处。 确保代码尽量简洁   不要什么都依赖JavaScript。不要编写重复性的脚本。要把JavaScript当作糖果工具,只是起到美化

yan_dk的专栏 1243

无依赖JavaScript插件:PriorityNavigation.js性能优化技巧

PriorityNavigation.js是一款纯JavaScript插件,能在菜单项不适合其父容器时自动移动它们,实现Priority+ Navigation功能且无任何依赖。它为网站导航提供了智能解决方案,尤其适合需要响应式设计的现代网站。 ## 为什么选择PriorityNavigation.js? 这款插件具有多项优势,使其在众多导航解决方案中脱颖而出: - **零依赖**:采用纯J

gitblog_00780的博客 939

JS | 如何更好地优化 JavaScript 的内存回收?

JavaScript的内存回收优化关键在于理解内存生命周期、减少内存泄露以及合理运用内存管理手段。具体方法包括:避免全局变量的滥用、使用局部变量以便回收、减少对闭包的不当使用、解绑无用的事件监听器、避免不必要的大型数据结构、使用WeakMap和WeakSet以便垃圾回收、利用Chrome DevTools定位内存问题。其中,解绑无用的事件监听器尤为重要,因为忘记解除绑定的事件监听器可能导致DOM元素无法被回收,从而产生内存泄露。这意味着即便相关DOM已从文档中移除,由于仍然存在引用(事件监听器),它的内存仍

青春木鱼的博客 964

Javascript模块化编程,本站使用 require.js 优化JS加载,SEO优化

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33726313的博客 116
上一篇: 不同浏览器对回车提交表单的处理办法
下一篇: onselectstart="javascript:return false;"
FuDesign2008
博客等级 码龄18年 44粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值