JavaScript性能优化(上)

JavaScript 性能优化实战【详细指南】 JavaScript 作为现代 Web 开发的核心技术,其性能优化涵盖多个关键领域,包括 代码执行效率、DOM 渲染优化、异步处理、内存管理、网络请求优化、动画与交互优化 等。随着 Web 生态的不断演进,许多新技术(如 WebAssembly、OffscreenCanvas、Streams API、WebGPU、V8 TurboFan、Priority Hints、ResizeObserver、Web Animations API 等)正在显著提升 JavaScript 的执行效率和渲染性能。 阅读详情

1. 减少 DOM 操作

减少 DOM 操作是优化 JavaScript 性能的重要方法,因为频繁的 DOM 操作会导致浏览器重绘和重排,从而影响性能。以下是一些具体的策略和技术,可以帮助有效减少 DOM 操作:

1.1. 批量更新 DOM

  • 亲切与母体:将多个 DOM 更新合并为一个操作。例如,可以创建一个空的容器,先在内存中构建所有需要的子元素,最后一次性将这个容器添加到主 DOM 树中。

const fragment = document.createDocumentFragment();  

// 假设我们要添加多个元素  
for (let i = 0; i < 100; i++) {  
    const newElement = document.createElement('div');  
    newElement.textContent = `Item ${i}`;  
    fragment.appendChild(newElement);  
}  

document.getElementById('container').appendChild(fragment); // 一次性添加  

 

1.2. 使用文档片段(DocumentFragment)

  • 文档片段 是一个轻量级的容器,用于存放要添加到 DOM 的元素。使用文档片段可以避免多次操作 DOM,因为它不会引起浏览器的重绘,直到片段被插入到 DOM 中。

const fragment = document.createDocumentFragment();  
// 构建元素  
for (let i = 0; i < 10; i++) {  
    const div = document.createElement('div');  
    div.textContent = 'Item ' + i;  
    fragment.appendChild(div);  
}  

document.getElementById('parent').appendChild(fragment); // 插入 DOM  

 

1.3. 最小化 CSS 修改

  • 合并样式更改:在对样式进行多次更改时,尽量将这些更改合并进行一次操作,以避免多次计算和重绘。

const element = document.getElementById('myElement');  

// 不推荐:多次修改可能会导致多次计算和重绘  
element.style.width = '100px';  
element.style.height = '100px';  
element.style.backgroundColor = 'red';  

// 推荐:合并设置  
element.style.cssText = 'width: 100px; height: 100px; background-color: red;';  

 

1.4. 使用 CSS 类切换

  • 类替换:通过添加或删除 CSS 类来批量应用样式更改,而不是单独设置每个样式属性。这样可以提高性能,因为浏览器对类的应用通常比对每个属性的应用更高效。

const element = document.getElementById('myElement');  
element.classList.add('new-style');  

 

1.5. 延迟 DOM 操作

  • 使用 requestAnimationFrame:对于动画和复杂的布局计算,可以在下一个重绘周期之前推迟 DOM 更改,避免在同一帧中进行多次修改。

requestAnimationFrame(() => {  
    // 在下一帧中更新 DOM  
    element.style.transform = 'translateY(100px)';  
});  

 

1.6. 减少不必要的查找

  • 缓存 DOM 查询结果:如果需要多次访问同一 DOM 元素,建议将其缓存到变量中,避免重复查询。

const container = document.getElementById('container');  
// 使用 container 变量替代多次查找  
const items = container.getElementsByTagName('div');  

 

1.7. 使用虚拟 DOM(在框架中)

  • 框架支持:像 React 这样的前端框架使用虚拟 DOM,把对 DOM 的操作批量合并,优化性能。虽然这种方式不是原生的 JavaScript 优化技术,但了解其原理可以帮助开发者更好地利用这些框架。

1.8.总结

减少 DOM 操作不仅可以提高页面性能,还能改善用户体验。通过批量更新、使用文档片段、最小化样式修改以及合理利用缓存等方法,你就可以显著提升应用的响应速度和执行效率。

2. 使用合适的数据结构

使用合适的数据结构是优化 JavaScript 性能的关键之一。选择合适的数据结构可以提高代码的执行效率、降低内存使用,甚至改善代码的可读性和可维护性。以下是一些常见的数据结构及其适用场景,帮助你在 JavaScript 中做出更好的选择。

2.1. 数组 (Array)

  • 用途:用于存储有序的数据集合。

  • 特性:支持按索引访问,插入和删除操作相对简单,但在中间插入或删除元素时可能较慢,因为需要移动元素。

const arr = [1, 2, 3, 4];  
arr.push(5);        // 添加元素  
arr.splice(2, 1);  // 删除元素  
console.log(arr);  // 输出: [1, 2, 4, 5]  

 

2.2. 对象 (Object)

  • 用途:用于存储键值对,不保证键的顺序。

  • 特性:适合存储属性和关系型数据,可以通过对象的属性快速访问和修改值。

const person = {  
    name: 'Alice',  
    age: 30  
};  
console.log(person.name); // 输出: Alice  
person.age = 31;          // 修改属性  

 

2.3. Map

  • 用途:用于存储键值对,支持任意类型的键。

  • 特性:与对象相比,Map 保持插入的顺序,并且可以更高效地进行查找、添加和删除操作。

const map = new Map();  
map.set('name', 'Alice');  
map.set('age', 30);  
console.log(map.get('name')); // 输出: Alice  

 

2.4. Set

  • 用途:用于存储唯一值的集合。

  • 特性:适合需要去重的场景,支持任意类型的值,且保持插入顺序。Set 的内存占用通常比数组要小。

const set = new Set();  
set.add(1);  
set.add(2);  
set.add(2); // 重复的值不会被添加  
console.log(set.has(1)); // 输出: true  

 

2.5. WeakMap

  • 用途:与 Map 类似,但键是弱引用。

  • 特性:适用于需要管理内存的场景,因为当键不再被引用时,WeakMap 中能自动清理这些条目。

const weakMap = new WeakMap();  
let obj = {};  
weakMap.set(obj, 'data');  
console.log(weakMap.get(obj)); // 输出: data  
obj = null;  // obj 不再存在,WeakMap 也能释放内存  

 

2.6. WeakSet

  • 用途:与 Set 类似,但值是弱引用。

  • 特性:适合存储需要被垃圾回收的对象,能够帮助管理内存,提高性能

const weakSet = new WeakSet();  
let obj = {};  
weakSet.add(obj);  
console.log(weakSet.has(obj)); // 输出: true  
obj = null;  // obj 不再存在,WeakSet 也能释放内存  

 

2.7. 链表 (Linked List) 和自定义数据结构

  • 用途:适合频繁进行插入和删除操作的场景。

  • 特性:相较于数组,链表在中间插入和删除元素的效率更高,但随机访问性能较差。不常用,但在特定场景下非常有效。

class Node {  
    constructor(data) {  
        this.data = data;  
        this.next = null;  
    }  
}  

class LinkedList {  
    constructor() {  
        this.head = null;  
    }  

    insert(data) {  
        const newNode = new Node(data);  
        newNode.next = this.head;  
        this.head = newNode; // 头部插入  
    }  
}  

const list = new LinkedList();  
list.insert(1);  
list.insert(2);  

选择合适的数据结构的考虑因素

  1. 操作类型:根据需要进行的操作(如添加、删除、查找)选择数据结构。
  2. 性能需求:不同数据结构在不同操作下的性能表现会有所不同,选择适合的可以减少性能瓶颈。
  3. 内存使用:在内存使用方面,Set 和 Map 等结构通常更高效,尤其是在处理大量数据时。
  4. 语义:选择有助于理解和维护代码的结构,使代码更具可读性。

2.8.总结

选择合适的数据结构可以显著提高 JavaScript 应用的性能。根据具体的使用场景,考虑操作性能、内存效率和代码可读性来选择最适合的数据结构。

3. 减少内存使用

减少内存使用是 JavaScript 性能优化的重要方面,尤其对于需要处理大量数据或运行在资源有限环境中的应用程序等场景。以下是一些减少 JavaScript 中内存使用的具体策略:

3.1. 避免内存泄漏

内存泄漏是指不再需要的对象仍被引用,导致它们无法被垃圾回收。为避免内存泄漏,可以采取以下策略:

  • 解除引用:确保不再使用的对象的引用被解除,特别是在事件处理器中。

function setup() {  
    const element = document.getElementById('myElement');  
    element.addEventListener('click', () => {  
        // 处理点击事件  
    });  
    // 离开时,要移除事件监听  
    return () => {  
        element.removeEventListener('click', handler);  
    };  
}  

使用弱引用:使用 WeakMap 和 WeakSet 来存储对象,这样当对象不再被使用时,内存可以自动释放。

const weakMap = new WeakMap();  

function storeData(obj, data) {  
    weakMap.set(obj, data);  
}  

function clearData(obj) {  
    weakMap.delete(obj); // 解除引用,允许回收  
}  

 

3.2. 限制全局变量

  • 尽量减少全局变量:全局变量在 JavaScript 中生命周期较长,容易导致内存泄漏和命名冲突。可以将变量封装在函数内部或使用模块化的方式。

(function() {  
    const myVariable = 'local value'; // 局部变量  
})(); // 立即执行函数,封闭变量  

 

3.3. 优化数据结构

  • 选择合适的数据结构:如前所述,使用适当的数据结构(如 Set、Map 等),可以减少不必要的数据存储,节省内存负担。

  • 避免不必要的数组和对象:如果只需要存储简单类型,尽量避免使用复杂的对象或数组。

3.4. 使用数组和对象的原型

  • 减少重复对象:对于重复使用的对象,可以复用同一个实例,而不是每次都创建新实例。

const sharedInstance = { prop: 'value' };  
const dataArray = [sharedInstance, sharedInstance]; // 复用对象实例  

 利用原型链:通过方式将方法放在对象的原型上,而不是每个实例中,减少内存占用。

function MyObject() {}  
MyObject.prototype.method = function() {  
    // 方法实现  
};  

const instance1 = new MyObject();  
const instance2 = new MyObject();  
// method 共享而不会重复存储  

3.5. 避免过大的数据集

  • 分页加载:避免一次加载大量数据,采用分页或懒加载的方式,以降低内存使用。

  • 优化数据存储:使用数据压缩基础库(如 lz-string)来减少存储使用的内存,适合大数据集的场景。

 

3.6. 控制闭包

  • 限制闭包的使用:闭包会保留其外部环境,确保不被使用的闭包不再引用外部变量。尽量不要在长期存在的数据结构中保存长时间运行的闭包。

function createCounter() {  
    let count = 0;  
    return function() {  
        count++;  
        return count;  
    };  
}  

const counter = createCounter(); // 适当使用闭包  

 

3.7. 定期清理不再使用的资源

  • 手动清理:对于大型应用程序,能够手动清理不再需要的对象(如终止数据处理、清除缓存、解除事件监听等)可以有效降低内存使用。

  • 使用浏览器的开发者工具:定期监控内存使用情况,使用 Chrome DevTools 的 Memory 面板分析内存快照,查找潜在的内存泄漏。

3.8. 优化算法和逻辑

  • 避免重复计算:使用缓存或记忆化来保存计算的结果。减少重复计算既能提升性能,也能降低内存使用。

const cache = {};  
function memoizedFunction(arg) {  
    if (cache[arg]) return cache[arg];  
    const result = computeHeavy(arg);  
    cache[arg] = result;  
    return result;  
}  

 

3.9. 适当关闭连接

  • 关闭不必要的连接:在网络请求、数据库连接等场景中,及时关闭连接,以避免不必要的资源占用。

3.10总结

通过执行上述策略,可以有效减少 JavaScript 的内存使用并提升应用的性能。管理内存是优化应用的关键,需要持续关注和监控,以确保应用在不同环境下运行良好。

4. 异步编程

异步编程是 JavaScript 中处理任务的一种方式,允许代码在等待某些操作(如网络请求、文件读取、定时器等)完成时继续执行其他代码。这种方式能够提高应用的响应性和性能,使得用户体验更加流畅。以下是有关 JavaScript 异步编程的详细说明。

4.1. 什么是异步编程?

异步编程允许在执行某个操作时不阻塞其他代码的执行。这意味着您可以在等待某些任务完成时,执行其他任务。常见的异步操作包括:

  • 网络请求(AJAX)
  • 文件读取
  • 定时器(setTimeout 和 setInterval)

4.2. 异步编程的传统方式

在 JavaScript 中,最早的异步编程是通过 回调函数(Callbacks) 来实现的。回调函数是当某个操作完成时调用的函数。

2.1 使用回调
function fetchData(callback) {  
    setTimeout(() => {  
        // 模拟异步操作  
        const data = { message: 'Hello, World!' };  
        callback(data);  
    }, 2000); // 2秒后执行回调  
}  

fetchData((data) => {  
    console.log(data.message); // 输出: Hello, World!  
});  

缺点:这种方式容易导致“回调地狱”,代码结构变得混乱,难以维护。 

4.3. Promise

为了解决回调地狱的问题,JavaScript 引入了 Promise,它表示一个可能在未来某个时间完成的操作。

3.1 使用 Promise
function fetchData() {  
    return new Promise((resolve, reject) => {  
        setTimeout(() => {  
            const data = { message: 'Hello, World!' };  
            resolve(data); // 任务成功时调用 resolve  
        }, 2000);  
    });  
}  

fetchData()  
    .then((data) => {  
        console.log(data.message); // 输出: Hello, World!  
    })  
    .catch((error) => {  
        console.error('Error:', error); // 处理错误  
    });  

 

3.2 Promise 的链式调用

Promise 支持链式调用,可以链式处理多个异步操作:

function fetchUser() {  
    return new Promise((resolve) => {  
        setTimeout(() => {  
            resolve({ id: 1, name: 'Alice' });  
        }, 1000);  
    });  
}  

function fetchPosts(userId) {  
    return new Promise((resolve) => {  
        setTimeout(() => {  
            resolve([  
                { userId, id: 1, title: 'Post 1' },  
                { userId, id: 2, title: 'Post 2' },  
            ]);  
        }, 1000);  
    });  
}  

fetchUser()  
    .then((user) => {  
        console.log('User:', user);  
        return fetchPosts(user.id); // 获取用户的帖子  
    })  
    .then((posts) => {  
        console.log('Posts:', posts);  
    })  
    .catch((error) => {  
        console.error('Error:', error);  
    });  

 

4.4. async/await 语法

async/await 是基于 Promise 的更简化的异步编程方法,使代码更具可读性。async 修饰函数,使其返回一个 Promise;await 用于等待 Promise 完成。

4.1 使用 async/await
async function fetchData() {  
    return new Promise((resolve) => {  
        setTimeout(() => {  
            resolve({ message: 'Hello, World!' });  
        }, 2000);  
    });  
}  

async function main() {  
    const data = await fetchData(); // 等待 Promise 完成  
    console.log(data.message); // 输出: Hello, World!  
}  

main();  

 

4.5. 错误处理

使用 Promise 和 async/await 时,处理异步操作中的错误是很重要的。

5.1 用 Promise 处理错误
fetchData()  
    .then((data) => {  
        console.log(data.message);  
    })  
    .catch((error) => {  
        console.error('Failed to fetch data:', error);  
    });  
5.2 用 async/await 处理错误 
async function main() {  
    try {  
        const data = await fetchData();  
        console.log(data.message);  
    } catch (error) {  
        console.error('Failed to fetch data:', error);  
    }  
}  

main();  

 

4.6. 并发处理

可以使用 Promise.all 来同时处理多个异步操作。

async function fetchData() {  
    // 模拟多个异步操作  
    const userPromise = fetchUser();  
    const postsPromise = fetchPosts(1);  
    
    const [user, posts] = await Promise.all([userPromise, postsPromise]);  
    console.log('User:', user);  
    console.log('Posts:', posts);  
}  

fetchData();  

4.7. 小结

异步编程在 JavaScript 中至关重要,适当地使用回调、Promise 和 async/await 可以提高应用的性能和用户体验。每种方法都有其优缺点,选择合适的异步编程风格可以减少代码复杂性,提高可读性。

 

5. 减少网络请求

减少网络请求是优化网页应用性能的一个重要方面。这不仅能提高加载速度,还能降低服务器负载和用户的带宽使用,最终改善用户体验。以下是一些减少网络请求的有效策略和技巧:

5.1. 合并请求

1.1 合并 CSS 和 JavaScript 文件
  • 将多个 CSS 文件合并为一个文件,这样可以减少请求数量。例如,将所有样式文件(style1.css、style2.css 等)合并成一个 main.css 文件。
  • 将多个 JavaScript 文件合并为一个文件,如将所有脚本文件(script1.js、script2.js 等)合并成一个 main.js 文件。
<!-- 之前的方式: -->  
<link rel="stylesheet" href="style1.css">  
<link rel="stylesheet" href="style2.css">  
<script src="script1.js"></script>  
<script src="script2.js"></script>  

<!-- 合并后: -->  
<link rel="stylesheet" href="main.css">  
<script src="main.js"></script>  

 

1.2 合并图像
  • 使用 CSS Sprites:将多个小图像合并为一个大图像,通过 CSS 背景定位来显示所需的部分,这样只需要一个请求来加载所有图像。
.sprite {  
    background-image: url('sprite.png');  
    width: 50px; /* 单个图像的宽度 */  
    height: 50px; /* 单个图像的高度 */  
}  
.icon1 {  
    background-position: 0 0; /* 第一个图像的位置 */  
}  
.icon2 {  
    background-position: -50px 0; /* 第二个图像的位置 */  
}  

 

5.2. 使用内容分发网络(CDN)

  • 将静态资源托管在 CDN 上。CDN 是分布在多个地理位置的服务器网络,可以更快速地提供用户所需的静态资源(如图像、CSS、JavaScript),从而减少请求延迟并提高加载速度。

 

5.3. 延迟加载资源

3.1 惰性加载
  • 只在需要时加载资源。用于图像、视频等非首次可见的内容,直到用户滚动到这些元素为止,可以显著减少初始网络请求。
<img data-src="image.jpg" class="lazy" alt="Lazy Loaded Image">  

 

const lazyImages = document.querySelectorAll('.lazy');  
const observer = new IntersectionObserver((entries) => {  
    entries.forEach(entry => {  
        if (entry.isIntersecting) {  
            const img = entry.target;  
            img.src = img.dataset.src; // 设置实际的 src  
            img.classList.remove('lazy');  
            observer.unobserve(img); // 停止观察  
        }  
    });  
});  

lazyImages.forEach(image => {  
    observer.observe(image); // 观察每个懒加载图像  
});  
3.2 使用 Preload
  • 预加载关键资源。可以通过 <link rel="preload"> 标签来告诉浏览器优先加载重要的资源。

 

<link rel="preload" href="important-script.js" as="script">  

 

5.4. 缓存策略

  • 利用浏览器缓存:通过 HTTP 头(如 Cache-Control 和 Expires)来配置资源的缓存策略,能够减少重复请求。
//http
Cache-Control: max-age=3600  // 资源可以被缓存 1 小时  
  • ETag 和 Last-Modified:使用 ETag 和 Last-Modified 头部,让浏览器在请求资源时能验证是否可以使用缓存内容。

 

5.5. 使用合适的请求方法

  • 选择 GET 和 POST 等的合适方法,对于一些不需要修改服务器状态的请求,可以使用 GET,这样可以利用浏览器缓存。
  • 简化请求参数,尽可能减少 URL 中的查询参数数量,以减少请求大小。

5.6. 避免重复请求 

  • 检查不会重复发送的请求:在必要时,使用状态变量来确保请求只有在所需时才会发送。
let isFetching = false;  

function fetchData() {  
    if (isFetching) return;  
    isFetching = true;  

    fetch('/api/data')  
        .then(response => response.json())  
        .then(data => {  
            // 处理数据  
        })  
        .finally(() => {  
            isFetching = false; // 请求完成,允许新的请求  
        });  
}  

 

5.7. 使用 GraphQL

  • 使用 GraphQL:GraphQL 允许客户端请求所需的数据,而不是获取整个数据集,可以减少不必要的数据传输。

5.8. 采用现代前端框架

  • 使用 React、Vue 或 Angular 等框架,它们通常会有优化网络请求的机制,如自动批量请求和状态管理工具,让异步数据请求更高效和简化。

5.9总结

减少网络请求不仅能加快页面加载速度,还能提高用户体验。采用合并请求、CDN、懒加载、缓存策略等方法,你将能够有效优化应用的性能。

    连载:JavaScript性能优化实战 【10章,11章,12章】现代JS性能优化,移动端优化,性能优化工具工作流 探讨了ES6+特性优化策略,包括箭头函数与普通函数的选择、模板字符串与拼接的对比,以及WebAssembly在计算密集型任务中的应用。移动端优化重点包括触摸事件处理(passive监听器)、内存管理(缓存控制)和网络感知加载策略(根据网络条件调整资源质量)。工作流工具章节介绍了自动化性能测试(Benchmark.js)、持续监控集成(CI/CD阈值检测)和构建优化(Webpack配置、代码分割)。最后详述了运行时性能监控SDK的实现,涵盖性能指标收集、错误跟踪 阅读详情

    相关推荐

    统信UOS系统盘空间不足?5分钟搞定扩容的图形化解决方案

    本文提供统信UOS系统盘空间不足的图形化扩容解决方案,使用GParted分区编辑器在不丢失数据的情况下快速完成扩容。详细步骤包括准备工作、空间调整和执行验证,适合技术用户快速解决问题。

    d6e7f8的博客 957

    JavaScript性能优化实战:批量 DOM 更新——使用 DocumentFragment 减少重排

    本文深入探讨了JavaScript中DOM操作性能优化的关键技术——使用DocumentFragment减少重排。通过分析DOM重排机制及其性能影响,指出频繁DOM更新会导致浏览器重复计算布局,严重影响页面响应速度。核心解决方案DocumentFragment作为轻量级文档片段,允许批量操作DOM节点后一次性插入,将多次重排合并为一次。实战演示显示,在处理1000个元素时,优化后性能提升90%以上。

    qinzhenyan的博客 1271

    从USB相机标定到Aruco码精准定位:基于aruco-ros的机器人视觉实践

    本文详细介绍了基于aruco-ros的机器人视觉实践,从USB相机标定到Aruco码精准定位的全流程。通过实战案例和优化技巧,展示了Aruco码在机器人导航中的高精度位姿识别能力,帮助开发者快速实现毫米级视觉定位系统。

    weixin_27310417的博客 487

    vue中更新dom注意点

    1.vue更新dom是异步更新的,在程序中修改完数据不会理解更新; 2.更新过程是批量更新的,在一次操作中若修改了三次数据,但是会执行一次;这样对性能的消耗会更更加少; 3.可以在this.$nextTick中进行更新dom后的操作。 <h1>使用nextTick获取最新dom</h1> <ul ref="list"> <li v-for='item in listData' ::key="item.id"> {{item}

    qq_42931285的博客 1524

    音频测试专题

    麦克风与扬声器单体测试指标及整机性能测试概述 麦克风测试指标包括频率响应、灵敏度、指向性等10项关键参数,用于评估声音捕捉和信号转换性能。扬声器测试包含频率响应、灵敏度等12项指标,涉及声学特性和物理参数。整机性能测试覆盖安静、嘈杂和正常三种环境,重点检测麦克风底噪、清晰度、扬声器音量及通话质量等12项功能指标。两类单体测试与整机测试共同构成完整的音频设备质量评估体系,确保产品在不同场景下的性能表现。

    weixin_52640906的博客 1318

    512分辨率万能遮罩模型实战指南:从下载到高精度应用

    本文提供了512分辨率万能遮罩模型的完整实战指南。该模型经过超过540万次迭代,专门优化了对头发、手、眼睛等复杂区域的识别。文章详细介绍了从可靠渠道下载、环境部署、使用DF_ICE工具批量应用遮罩,到利用XSeg Editor进行高精度精修的全流程,旨在帮助用户显著提升AI换脸合成视频的质量与效率。

    y2z3a4b5c的博客 1165

    大量插入dom元素的方法

    笔试的时候做到一道题:向&amp;amp;lt;ul id=&amp;quot;root&amp;quot;&amp;amp;gt;&amp;amp;lt;/ul&amp;amp;gt;插入1000条&amp;amp;lt;li&amp;amp;gt;我是li标签&amp;amp;lt;/li&amp;amp;gt;标签,一般我们会想到使用循环,但是,由于渲染回流,在for循环内部多次appendChild会造成多次渲染,从而出

    Astar的博客 5880

    Aloudata 荣登“数智技术系列榜单”和“数据智能服务商 TOP30”

    持续助力各行业数智化先进企业突破数据管理技术瓶颈,以更加敏捷、精准和可靠的数据交付驱动企业业务创新与经营提效

    Aloudata的博客 667

    如何优化批量修改DOM的操作

    当需要对DOM元素进行一系列操作时,可以通过以下步骤来减少重绘和重排的次数: 1、使元素脱离文档流; 2、对其应用多重DOM改变; 3、把元素带回到元文档中。 该过程会触发两次重排(reflow),如果忽略这两个操作,则第二部操作会造成多次重排。 如何使元素脱离文档流: 1、隐藏元素,DOM修改,重新显示;       这里主要通过display属性达到 2、使用文档片段(

    michael8512的博客 3967

    YOLOv12改进策略【注意力机制篇】| 添加SE、CBAM、ECA、CA、Swin Transformer等注意力和多头注意力机制

    这篇文章带来一个经典注意力模块的汇总,虽然有些模块已经发布很久了,但后续的注意力模块也都是在此基础之上进行改进的,对于初学者来说还是有必要去学习了解一下,以加深对模块,模型的理解。

    Limiiiing的博客 1511

    Cesium 实战 28 - 三维视频融合(视频投影)

    Cesium 实战 27 - 三维视频融合(视频投影)。

    非科班Java出身GISer的博客 3369

    Vue0.11版本源码阅读系列五:批量更新是怎么做的

    在第三篇vue0.11版本源码阅读系列三:指令编译里我们知道如果某个属性的值变化了,会调用依赖该属性的watcher的update方法: p.update = function () { if (!config.async || config.debug) { this.run() } else { batcher.push(this) } } 它没有直接调用指令的update方法,而是交给了batcher,本篇来看一下这个batcher做了什么。 顾名思义,batcher是批

    sinat_33488770的博客 310

    stable diffusioncontrolNet 预处理器/模型的下载及安装使用教程

    首先说明,controlNet 的模型 不同于stable diffusion 模型,这一点一定要区分清楚。下面提供多个ControlNet 预处理器+ 专用模型的百度网盘下载链接,都是由群友整理贡献,但各自包含的版本不同,大家可自行选择。推荐下载紫色链接内的模型,fp16版文件更小,稍微新一些的controlnet插件还添加了对control-lora的支持(注意,要求controlnet插件的版本比12月16号新(1.1.423以上)才能正常识别),推荐下载;

    代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3385

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

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

    weixin_33487811的博客 509

    精雕软件(JDpaint) 5.5 绿色版

    精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

    WINCC7.3破解文件

    WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

    gitblog_00780的博客 939

    SIMATIC S7-1200, S7-1500 PID 控制[手册]

    SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

    weixin_36193690的博客 3383

    efm32 入门.pdf

    本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

    JavaScript性能优化篇js优化

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

    yan_dk的专栏 1243

    Zed 配置 Elm 语言支持:扩展安装、elm-language-server 设置与格式化流程

    Zed 并未内置 Elm 支持,而是通过官方扩展体系提供完整的 Elm 开发能力:语法高亮依赖 Tree-sitter,语义级功能(补全、诊断、跳转)由 `elm-language-server` 提供,格式化与静态检查分别由 `elm-format` 与 `elm-review` 完成。本文以 Zed 官方语言文档 [docs/src/languages/elm.md](https://link

    gitblog_00589的博客 884

    DeepSeek Harness 破甲插件 dsh-purge:完整安装与提示词切换快速指南

    dsh-purge 是装在本机官方 DeepSeek Harness(DSH)身上的 DeepSeek Harness 插件:它把宿主策略清洗和按模型下发的破甲提示词拆成两层,再配上受控演练台,让你一句「拒绝」到底出自模型还是宿主,一步就能定性。 ## 它解决什么问题 没有它:模型答不上一个问题,你分不清是模型自身的安全对齐,还是 Harness 运行时在改提示词、审批门、沙箱和会话格式时先拦

    gitblog_00146的博客 471

    Hammer.js终极性能优化指南:从JavaScript到WebAssembly的进阶之路

    Hammer.js作为一款强大的JavaScript多点触控手势库,为Web应用提供了流畅的触摸交互体验。本指南将揭示从基础优化到高级进阶的完整路径,帮助开发者充分释放Hammer.js的性能潜力,打造响应迅速的触控应用。 ## 🌟 核心性能优化策略 ### 1️⃣ 启用单用户触摸处理模式 Hammer.js提供了专为单用户场景优化的触摸处理模式,能显著提升单点触控性能。通过启用`singl

    gitblog_01104的博客 1146

    【原生JS】从语言底层分析与性能优化JavaScript指南

    本文深入探讨JavaScript性能优化的核心原理与实践策略,涵盖V8引擎架构、JIT编译、内联缓存等底层技术。主要内容包括:1)解析V8引擎的隐藏类优化机制;2)详解JIT编译与多态内联缓存技术;3)提供变量声明、循环结构等语法优化方案;4)对比不同数据结构的性能差异。通过预定义对象结构、缓存循环长度等具体优化技巧,帮助开发者编写高性能JavaScript代码。文章结合丰富代码示例,展示了从基础语法到高级编译优化的全方位性能提升方法。

    silverclayz的技术分享 853

    javascript性能优化四 之堆栈中js执行过程等

    JSBench的使用 jsperf已经停止维护了,介绍一个新的www.jsbench.me性能测试网站 堆栈中的JS执行过程 通过画图的方式走一遍上面代码块的流程 当浏览器真正要执行代码的时候肯定有一个执行上下文的环境的ECStack,用于存放执行上下文。 Js代码在开始执行之后首先会在堆内存里创建一个执行环境栈,然后用他来存放着不同的执行上下文,代码从上往下执行最先创建的是应该是EC(G全局执行上下文),在下面把代码都执行了申明和存放,基本数据类型是存放在栈内存里的,而对于引用类型来说是存放在堆区里

    山有木兮的博客 402

    DLSS Swapper 完整指南:免费把游戏里的 DLSS、FSR、XeSS 换成新版并自动备份

    游戏里随附的 DLSS、FSR、XeSS 版本常常停在几年前的水平,官方补丁迟迟不来。DLSS Swapper 是一款免费开源的 DLL 版本替换工具,帮你直接升级或降级这些文件,不用等游戏更新。整个流程通常 10 分钟内完成,每次替换前原文件都会被自动备份,随时可以一键还原。 ## 换完后的终态:三个可观察的变化 做完之后,游戏目录里那份旧 DLL 已经换成你选的新版,而原版文件以 `.dl

    gitblog_00913的博客 304

    js和java 性能优化,JavaScript 性能优化技巧分享

    原标题:JavaScript 性能优化技巧分享来自:葡萄城控件链接:cnblogs.com/powertoolsteam/p/java-performance-optimization.html原文:sitepoint.com/java-performance-optimization-tips-an-overview/Java 作为当前最为常见的直译式脚本语言,已经广泛应用于 Web 应用开发中...

    weixin_34660766的博客 522

    vscode-js-debug性能优化指南:如何快速调试大型JavaScript应用

    vscode-js-debug是一款兼容DAP协议的JavaScript调试器,广泛应用于VS Code等开发环境。对于大型JavaScript应用,调试性能往往成为开发效率的瓶颈。本文将分享实用的性能优化技巧,帮助开发者快速定位和解决调试过程中的性能问题,提升调试体验。 ## 一、启用自动附加调试功能 自动附加调试功能可以让vscode-js-debug在Node.js进程启动时自动附加,避

    gitblog_00001的博客 387

    Javascript性能优化

    JavaScript性能研究 @author huangteng 前言有关javascript性能的探究,目的只是找出性能提升的最佳途径。 我们执着于性能提升,也就是为了给用户带来最好的体验。 其实一说起性能,大概脑子里第一反应就是同步执行和异步执行。 当然,大家都会选择交替的并发执行(异步)的方式,这样减少阻塞,使得 我们的应用更加流畅。本次探究我们分为两个层次,一个是程序

    个人新博客: https://cbbfcd.github.io/ 480
    上一篇: AI在未来会不会代替人工???
    下一篇: JavaScript性能优化(下)
    DirectYang
    博客等级 码龄3年 1516粉丝 82原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

    当前余额3.43元 前往充值 >
    需支付:10.00元
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    DirectYang

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付元
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值