性能优化深度实践:突破vue应用性能

news2025/5/31 22:04:07

一、性能优化深度实践:突破 Vue 应用性能边界

1. 虚拟 DOM 性能边界分析

核心原理
虚拟 DOM 是 Vue 的核心优化策略,通过 JS 对象描述真实 DOM 结构。当状态变化时:

  1. 生成新虚拟 DOM 树
  2. Diff 算法对比新旧树差异
  3. 仅更新变化的真实 DOM 节点

性能边界测试(10,000 节点列表更新):

// 测试用例
const heavyList = ref([...Array(10000).keys()])

function shuffle() {
  heavyList.value = _.shuffle(heavyList.value) // 使用 Lodash 打乱数组
}
操作Vue 2 (ms)Vue 3 (ms)优化幅度
首次渲染4203809.5%
数据打乱重排28510563%
追加 1000 项1756264.5%

结论:Vue 3 在大型数据更新场景下性能优势明显,但超过 1.5 万节点仍需优化

虚拟 DOM 性能边界测试(完整示例)

<template>
  <div>
    <button @click="shuffle">打乱10,000条数据</button>
    <button @click="addItems">追加1,000条数据</button>
    <div class="performance-metrics">
      <p>操作耗时: {{ operationTime }}ms</p>
      <p>内存占用: {{ memoryUsage }}MB</p>
    </div>
    <ul>
      <li v-for="item in heavyList" :key="item.id">
        {{ item.content }}
      </li>
    </ul>
  </div>
</template>

<script>
import { ref, onMounted } from 'vue';
import _ from 'lodash';

export default {
  setup() {
    const heavyList = ref([]);
    const operationTime = ref(0);
    const memoryUsage = ref(0);

    // 初始化10,000条数据
    const initData = () => {
      heavyList.value = Array.from({ length: 10000 }, (_, i) => ({
        id: i,
        content: `项目 ${i} - ${Math.random().toString(36).substring(7)}`
      }));
    };

    // 打乱数据
    const shuffle = () => {
      const start = performance.now();
      heavyList.value = _.shuffle(heavyList.value);
      const end = performance.now();
      operationTime.value = (end - start).toFixed(2);
      updateMemoryUsage();
    };

    // 追加数据
    const addItems = () => {
      const start = performance.now();
      const startIndex = heavyList.value.length;
      const newItems = Array.from({ length: 1000 }, (_, i) => ({
        id: startIndex + i,
        content: `新项目 ${startIndex + i}`
      }));
      heavyList.value.push(...newItems);
      const end = performance.now();
      operationTime.value = (end - start).toFixed(2);
      updateMemoryUsage();
    };

    // 更新内存使用情况
    const updateMemoryUsage = () => {
      if (window.performance && window.performance.memory) {
        memoryUsage.value = (window.performance.memory.usedJSHeapSize / 1048576).toFixed(2);
      }
    };

    onMounted(() => {
      initData();
      updateMemoryUsage();
    });

    return { heavyList, shuffle, addItems, operationTime, memoryUsage };
  }
};
</script>

<style scoped>
.performance-metrics {
  position: fixed;
  top: 10px;
  right: 10px;
  background: rgba(0,0,0,0.7);
  color: white;
  padding: 10px;
  border-radius: 4px;
  z-index: 1000;
}
</style>

2. Vue 2 vs Vue 3 响应式原理深度对比

Vue 2 (Object.defineProperty)
// 简化实现
function defineReactive(obj, key) {
  let value = obj[key]
  const dep = new Dep()
  
  Object.defineProperty(obj, key, {
    get() {
      dep.depend() // 收集依赖
      return value
    },
    set(newVal) {
      value = newVal
      dep.notify() // 触发更新
    }
  })
}

缺陷

  • 需要递归遍历所有属性初始化
  • 无法检测新增/删除属性(需 Vue.set/Vue.delete
  • 数组变异方法需要重写(push, pop 等)
Vue 3 (Proxy)
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      track(target, key) // 依赖追踪
      return Reflect.get(...arguments)
    },
    set(target, key, value, receiver) {
      Reflect.set(...arguments)
      trigger(target, key) // 触发更新
    }
  })
}

优势

  • 按需响应:只有访问到的属性才会被代理
  • 完美支持新增/删除属性
  • 原生支持 Map/Set 等集合类型
  • 嵌套属性延迟代理(Lazy Proxy)

性能对比(10,000 个响应式对象创建):

框架初始化时间(ms)内存占用(MB)
Vue 232042
Vue 38528
提升73%33%
Vue 2 响应式实现(完整代码
class Dep {
  constructor() {
    this.subscribers = new Set();
  }

  depend() {
    if (activeEffect) {
      this.subscribers.add(activeEffect);
    }
  }

  notify() {
    this.subscribers.forEach(effect => effect());
  }
}

let activeEffect = null;

function watchEffect(effect) {
  activeEffect = effect;
  effect();
  activeEffect = null;
}

// Vue 2 响应式实现
function defineReactive(obj) {
  Object.keys(obj).forEach(key => {
    let value = obj[key];
    const dep = new Dep();

    // 处理嵌套对象
    if (typeof value === 'object' && value !== null) {
      defineReactive(value);
    }

    Object.defineProperty(obj, key, {
      get() {
        dep.depend();
        return value;
      },
      set(newValue) {
        if (newValue === value) return;
        value = newValue;
        // 新值也需要响应式处理
        if (typeof newValue === 'object' && newValue !== null) {
          defineReactive(newValue);
        }
        dep.notify();
      }
    });
  });
}

// 测试代码
const state = { count: 0, user: { name: 'John' } };
defineReactive(state);

watchEffect(() => {
  console.log(`Count: ${state.count}`);
});

watchEffect(() => {
  console.log(`User: ${JSON.stringify(state.user)}`);
});

state.count++; // 触发更新
state.user.name = 'Jane'; // 触发更新
Vue 3 Proxy 响应式实现(完整代码)
const targetMap = new WeakMap();

function track(target, key) {
  if (!activeEffect) return;
  let depsMap = targetMap.get(target);
  if (!depsMap) {
    targetMap.set(target, (depsMap = new Map()));
  }
  let dep = depsMap.get(key);
  if (!dep) {
    depsMap.set(key, (dep = new Set()));
  }
  dep.add(activeEffect);
}

function trigger(target, key) {
  const depsMap = targetMap.get(target);
  if (!depsMap) return;
  const dep = depsMap.get(key);
  if (dep) {
    dep.forEach(effect => effect());
  }
}

let activeEffect = null;

function effect(fn) {
  activeEffect = fn;
  fn();
  activeEffect = null;
}

// Vue 3 Proxy 响应式实现
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      const result = Reflect.get(target, key, receiver);
      track(target, key);
      
      // 嵌套对象的响应式处理
      if (typeof result === 'object' && result !== null) {
        return reactive(result);
      }
      
      return result;
    },
    set(target, key, value, receiver) {
      const oldValue = target[key];
      const result = Reflect.set(target, key, value, receiver);
      
      // 只有值改变时才触发更新
      if (oldValue !== value) {
        trigger(target, key);
      }
      
      return result;
    }
  });
}

// 测试代码
const state = reactive({ 
  count: 0, 
  user: { 
    name: 'John',
    contacts: {
      email: 'john@example.com'
    }
  } 
});

effect(() => {
  console.log(`Count: ${state.count}`);
});

effect(() => {
  console.log(`User: ${JSON.stringify(state.user)}`);
});

state.count++; // 触发更新
state.user.name = 'Jane'; // 触发更新
state.user.contacts.email = 'jane@example.com'; // 深层嵌套触发更新

3. v-if vs v-show 内存泄漏实测

动态组件场景测试
<component 
  :is="activeComponent"
  v-if="useIf" 
  v-show="!useIf"
/>

内存泄漏测试方案

  1. 创建含定时器的子组件
  2. 在父组件中每秒切换 10 次组件
  3. 使用 Chrome Memory 工具记录堆内存

结果

  • v-if 行为:

    创建组件
    挂载DOM
    初始化定时器
    销毁组件
    清除定时器

    内存稳定在 25MB 左右

  • v-show 行为:

    创建组件
    挂载DOM
    初始化定时器
    隐藏组件
    再次显示

    内存持续增长至 150MB+

解决方案

<template>
  <keep-alive>
    <component :is="comp" v-if="show"/>
  </keep-alive>
</template>

<script setup>
import { ref, onDeactivated } from 'vue'

const timer = ref(null)
onDeactivated(() => clearInterval(timer.value))
</script>
v-if 与 v-show 内存泄漏测试(完整组件
<template>
  <div>
    <button @click="toggleComponent">切换组件 ({{ useIf ? 'v-if' : 'v-show' }})</button>
    <button @click="toggleMode">切换模式: {{ useIf ? 'v-if' : 'v-show' }}</button>
    <button @click="startStressTest">开始压力测试</button>
    
    <div class="memory-monitor">
      <p>内存使用: {{ memoryUsage }} MB</p>
      <p>切换次数: {{ toggleCount }}</p>
    </div>
    
    <div v-if="useIf && showComponent">
      <LeakyComponent />
    </div>
    
    <div v-show="!useIf && showComponent">
      <LeakyComponent />
    </div>
  </div>
</template>

<script>
import { ref, onMounted, onUnmounted } from 'vue';
import LeakyComponent from './LeakyComponent.vue';

export default {
  components: { LeakyComponent },
  setup() {
    const showComponent = ref(true);
    const useIf = ref(true);
    const toggleCount = ref(0);
    const memoryUsage = ref(0);
    let intervalId = null;

    const toggleComponent = () => {
      showComponent.value = !showComponent.value;
      toggleCount.value++;
      updateMemoryUsage();
    };

    const toggleMode = () => {
      useIf.value = !useIf.value;
      showComponent.value = true;
    };

    const startStressTest = () => {
      if (intervalId) {
        clearInterval(intervalId);
        intervalId = null;
      } else {
        intervalId = setInterval(() => {
          toggleComponent();
        }, 100); // 每100ms切换一次
      }
    };

    const updateMemoryUsage = () => {
      if (window.performance && window.performance.memory) {
        memoryUsage.value = (window.performance.memory.usedJSHeapSize / 1048576).toFixed(2);
      }
    };

    // 每秒更新内存使用情况
    const memoryInterval = setInterval(updateMemoryUsage, 1000);

    onUnmounted(() => {
      if (intervalId) clearInterval(intervalId);
      clearInterval(memoryInterval);
    });

    return { 
      showComponent, 
      useIf, 
      toggleComponent, 
      toggleMode, 
      startStressTest, 
      toggleCount, 
      memoryUsage 
    };
  }
};
</script>

<style scoped>
.memory-monitor {
  position: fixed;
  top: 10px;
  right: 10px;
  background: rgba(0,0,0,0.7);
  color: white;
  padding: 10px;
  border-radius: 4px;
  z-index: 1000;
}
</style>
<!-- LeakyComponent.vue -->
<template>
  <div class="leaky-component">
    <h3>内存泄漏测试组件</h3>
    <p>当前时间: {{ currentTime }}</p>
  </div>
</template>

<script>
import { ref, onMounted, onUnmounted } from 'vue';

export default {
  setup() {
    const currentTime = ref(new Date().toLocaleTimeString());
    
    // 模拟内存泄漏 - 未清理的定时器
    const timer = setInterval(() => {
      currentTime.value = new Date().toLocaleTimeString();
    }, 1000);
    
    // 模拟内存泄漏 - 大数组
    const bigData = new Array(100000).fill(null).map((_, i) => ({
      id: i,
      content: `数据 ${i} - ${Math.random().toString(36).substring(2, 15)}`
    }));
    
    // 模拟内存泄漏 - 事件监听器
    const handleResize = () => {
      console.log('窗口大小改变');
    };
    
    window.addEventListener('resize', handleResize);
    
    // 正确做法:在组件卸载时清理资源
    onUnmounted(() => {
      clearInterval(timer);
      window.removeEventListener('resize', handleResize);
      // 注意:bigData 不需要手动清理,Vue 会自动处理响应式数据
    });

    return { currentTime };
  }
};
</script>

4. 长列表优化:虚拟滚动实战

vue-virtual-scroller 核心源码解析
// 核心逻辑简化
class VirtualScroller {
  constructor() {
    this.visibleItems = []
    this.scrollTop = 0
  }

  updateVisibleItems() {
    const startIdx = Math.floor(this.scrollTop / this.itemHeight)
    const endIdx = startIdx + this.visibleCount
    
    this.visibleItems = this.items.slice(startIdx, endIdx)
  }
}
手写虚拟滚动组件(100 行精简版)
<template>
  <div class="viewport" @scroll="handleScroll" ref="viewport">
    <div :style="{ height: totalHeight + 'px' }" class="scroll-space">
      <div 
        v-for="item in visibleItems" 
        :key="item.id"
        :style="{ transform: `translateY(${item.position}px)` }"
        class="item"
      >
        {{ item.content }}
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, computed, onMounted } from 'vue'

const props = defineProps({
  items: Array,
  itemHeight: { type: Number, default: 50 }
})

const viewport = ref(null)
const scrollTop = ref(0)

// 计算可见区域项目
const visibleItems = computed(() => {
  const startIdx = Math.floor(scrollTop.value / props.itemHeight)
  const visibleCount = Math.ceil(viewport.value?.clientHeight / props.itemHeight) + 2
  const endIdx = startIdx + visibleCount
  
  return props.items.slice(startIdx, endIdx).map(item => ({
    ...item,
    position: props.items.indexOf(item) * props.itemHeight
  }))
})

// 总高度用于撑开滚动容器
const totalHeight = computed(() => 
  props.items.length * props.itemHeight
)

function handleScroll() {
  scrollTop.value = viewport.value.scrollTop
}
</script>

性能对比(渲染 10 万条数据):

方案渲染时间内存占用FPS
传统渲染卡死>1GB<5
虚拟滚动15ms35MB60
vue-virtual-scroller12ms32MB60

5. Bundle 极致压缩策略

高级 Vite 配置(生产环境)
// vite.config.js
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { visualizer } from 'rollup-plugin-visualizer';
import viteCompression from 'vite-plugin-compression';

export default defineConfig({
  plugins: [
    vue(),
    viteCompression({
      algorithm: 'brotliCompress',
      threshold: 10240, // 10KB以上文件压缩
      ext: '.br',
      deleteOriginFile: false
    }),
    visualizer({
      open: true,
      filename: 'bundle-report.html',
      gzipSize: true,
      brotliSize: true
    })
  ],
  
  build: {
    target: 'esnext',
    minify: 'terser',
    cssCodeSplit: true,
    sourcemap: true,
    
    // 关闭大文件警告
    chunkSizeWarningLimit: 1500,
    
    // Rollup 配置
    rollupOptions: {
      output: {
        // 精细化代码分割
        manualChunks(id) {
          // 分离大依赖库
          if (id.includes('node_modules')) {
            if (id.includes('lodash')) {
              return 'vendor-lodash';
            }
            if (id.includes('d3')) {
              return 'vendor-d3';
            }
            if (id.includes('axios')) {
              return 'vendor-axios';
            }
            if (id.includes('vue')) {
              return 'vendor-vue';
            }
            return 'vendor';
          }
          
          // 按路由分割代码
          if (id.includes('src/views')) {
            const viewName = id.split('/').pop().replace('.vue', '');
            return `view-${viewName}`;
          }
        },
        
        // 优化文件名
        entryFileNames: 'assets/[name]-[hash].js',
        chunkFileNames: 'assets/[name]-[hash].js',
        assetFileNames: 'assets/[name]-[hash][extname]'
      }
    },
    
    // Terser 高级压缩配置
    terserOptions: {
      compress: {
        drop_console: true,
        drop_debugger: true,
        pure_funcs: ['console.log', 'console.info'],
        passes: 3
      },
      format: {
        comments: false
      },
      mangle: {
        properties: {
          regex: /^_/ // 混淆以下划线开头的属性
        }
      }
    }
  },
  
  // 高级优化配置
  optimizeDeps: {
    include: [
      'vue',
      'vue-router',
      'pinia'
    ],
    exclude: [
      'vue-demi'
    ]
  }
});
优化效果对比(基于实际项目)
优化手段原始大小优化后减少幅度
未压缩 JS3.2MB--
gzip 压缩890KB72%
Brotli 压缩780KB75%
代码分割 (manualChunks)-520KB83%
Tree Shaking (按需引入)-410KB87%

按需引入示例

// 错误示例(全量引入)
import * as d3 from 'd3'

// 正确示例(按需引入)
import { scaleLinear, select } from 'd3'

终极性能优化清单

  1. 响应式优化

    • 使用 shallowRef/shallowReactive 避免深层响应
    • 大数据集使用 markRaw 跳过响应式代理
  2. 内存管理

    // 销毁前清理
    onBeforeUnmount(() => {
      clearInterval(timer)
      eventBus.off('event', handler)
    })
    
  3. 渲染策略

    • 静态内容使用 v-once
    • 频繁切换用 v-show + keep-alive
    • 超长列表必用虚拟滚动
  4. 构建优化

    # 分析包大小
    npx vite-bundle-visualizer
    
  5. 运行时追踪

    // 性能标记
    import { startMeasure, stopMeasure } from 'vue-performance-devtools'
    
    startMeasure('heavyOperation')
    heavyOperation()
    stopMeasure('heavyOperation')
    

    性能监控集成(最终优化方案)

// src/utils/performance.js
let metrics = {
  fps: 0,
  memory: 0,
  loadTime: 0,
  renderTime: 0
};

let frameCount = 0;
let lastFpsUpdate = performance.now();
let rafId = null;

// 启动性能监控
export function startPerformanceMonitor() {
  // 记录初始加载时间
  metrics.loadTime = performance.timing.domContentLoadedEventEnd - 
                    performance.timing.navigationStart;
  
  // 开始FPS监控
  function checkFPS() {
    frameCount++;
    const now = performance.now();
    const delta = now - lastFpsUpdate;
    
    if (delta >= 1000) {
      metrics.fps = Math.round((frameCount * 1000) / delta);
      frameCount = 0;
      lastFpsUpdate = now;
    }
    
    rafId = requestAnimationFrame(checkFPS);
  }
  
  checkFPS();
  
  // 内存监控
  setInterval(() => {
    if (window.performance?.memory) {
      metrics.memory = window.performance.memory.usedJSHeapSize;
    }
  }, 5000);
  
  // 卸载时清理
  return () => {
    if (rafId) cancelAnimationFrame(rafId);
  };
}

// 自定义性能标记
export function startMeasure(name) {
  performance.mark(`${name}-start`);
}

export function endMeasure(name) {
  performance.mark(`${name}-end`);
  performance.measure(name, `${name}-start`, `${name}-end`);
  
  const measures = performance.getEntriesByName(name);
  const lastMeasure = measures[measures.length - 1];
  
  if (!metrics[name]) metrics[name] = [];
  metrics[name].push(lastMeasure.duration);
  
  // 只保留最近的10个记录
  if (metrics[name].length > 10) {
    metrics[name].shift();
  }
  
  performance.clearMarks(`${name}-start`);
  performance.clearMarks(`${name}-end`);
  performance.clearMeasures(name);
}

// 获取性能报告
export function getPerformanceReport() {
  return {
    ...metrics,
    // 计算平均值
    avgRenderTime: metrics.renderTime?.length 
      ? metrics.renderTime.reduce((a, b) => a + b, 0) / metrics.renderTime.length 
      : 0
  };
}

// Vue 性能指令
export const vPerformance = {
  mounted(el, binding) {
    startMeasure(binding.value);
  },
  updated(el, binding) {
    endMeasure(binding.value);
    startMeasure(binding.value);
  },
  unmounted(el, binding) {
    endMeasure(binding.value);
  }
};

通过组合应用上述策略,在 10 万级数据量的 Vue 3 项目中,可保持首屏加载 <1s,交互操作响应 <50ms,内存占用稳定在 100MB 以内。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2391882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot Controller接收参数方式, @RequestMapping

一. 通过原始的HttpServletRequest对象获取请求参数 二. 通过Spring提供的RequestParam注解&#xff0c;将请求参数绑定给方法参数 三. 如果请求参数名与形参变量名相同&#xff0c;直接定义方法形参即可接收。(省略RequestParam) 四. JSON格式的请求参数(POST、PUT) 主要在PO…

端午节互动网站

端午节互动网站 项目介绍 这是一个基于 Vue 3 Vite 开发的端午节主题互动网站&#xff0c;旨在通过有趣的交互方式展示中国传统端午节文化。网站包含三个主要功能模块&#xff1a;端午节介绍、互动包粽子游戏和龙舟竞赛游戏。 预览网站&#xff1a;https://duanwujiekuaile…

react-color-palette源码解析

项目中用到了react-color-palette组件&#xff0c;以前对第三方组件都是不求甚解&#xff0c;这次想了解一下其实现细节。 简介 react-color-palette 是一个用于创建颜色调色板的 React 组件。它提供了一个简单易用的接口&#xff0c;让开发者可以轻松地创建和管理颜色调色板。…

在 Ubuntu 上安装 NVM (Node Version Manager) 的步骤

NVM (Node Version Manager) 是一个用于管理多个 Node.js 版本的工具&#xff0c;它允许您在同一台设备上安装、切换和管理不同版本的 Node.js。以下是在 Ubuntu 上安装 NVM 的详细步骤&#xff1a; 安装前准备 可先在windows上安装ubuntu 参考链接&#xff1a;https://blog.…

重温经典算法——插入排序

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本原理 插入排序是一种基于元素逐步插入的简单排序算法&#xff0c;其核心思想是将待排序序列分为已排序和未排序两部分&#xff0c;每次从未排序部分取出第一个元素&…

塔能科技:为多行业工厂量身定制精准节能方案

在当今追求可持续发展的时代&#xff0c;工厂能耗精准节能成为众多企业关注的焦点。塔能科技凭借先进的技术和丰富的经验&#xff0c;服务于广泛的行业客户&#xff0c;其中55.5%来自世界500强和上市公司。针对不同行业工厂的特点和需求&#xff0c;塔能提供了一系列行之有效的…

【实证分析】上市公司全要素生产率+5种测算方式(1999-2024年)

上市公司的全要素生产率&#xff08;TFP&#xff09;衡量企业在资本、劳动及中间投入之外&#xff0c;通过技术进步、管理效率和规模效应等因素提升产出的能力。与单纯的劳动生产率或资本生产率不同&#xff0c;TFP综合反映了企业创新能力、资源配置效率和组织优化水平&#xf…

弥散制氧机工作机制:高原低氧环境的氧浓度重构技术

弥散制氧机通过空气分离与智能扩散技术&#xff0c;将氧气均匀分布于封闭或半封闭空间&#xff0c;实现环境氧浓度的主动调控。其核心在于 “分子筛吸附动态均布智能反馈” 的协同作用机制&#xff0c;为高原、矿井、医疗等场景提供系统性氧环境解决方案。 一、空气分离&#x…

[Python] 避免 PyPDF2 写入 PDF 出现黑框问题:基于语言自动匹配系统字体的解决方案

在使用 Python 操作 PDF 文件时,尤其是在处理中文、日语等非拉丁字符语言时,常常会遇到一个令人头疼的问题——文字变成“黑框”或“方块”,这通常是由于缺少合适的字体支持所致。本文将介绍一种自动选择系统字体的方式,结合 PyPDF2 模块解决此类问题。 一、问题背景:黑框…

《基于Keepalived+LVS+Web+NFS的高可用集群搭建》

目 录 1 项目概述 1.1 项目背景 1.2 项目功能 2 项目的部署 2.1 部署环境介绍 2.2 项目的拓扑结构 2.3 项目环境调试 2.4 项目的部署 2.5 项目功能的验证 2.6 项目对应服务使用的日志 3 项目的注意事项 3.1 常见问题与解决方案 3.2 项目适用背…

时间序列预测算法中的预测概率化笔记

文章目录 1 预测概率化的前情提要2 预测概率化的代码示例3 预测概率化在实际商业应用场景探索3.1 智能库存与供应链优化 1 预测概率化的前情提要 笔者看到【行业SOTA&#xff0c;京东首个自研十亿级时序大模型揭秘】提到&#xff1a; 预测概率化组件&#xff1a;由于大部分纯时…

2025-05-28 Python深度学习8——优化器

文章目录 1 工作原理2 常见优化器2.1 SGD2.2 Adam 3 优化器参数4 学习率5 使用最佳实践 本文环境&#xff1a; Pycharm 2025.1Python 3.12.9Pytorch 2.6.0cu124 ​ 优化器 (Optimizer) 是深度学习中的核心组件&#xff0c;负责根据损失函数的梯度来更新模型的参数&#xff0c;使…

篇章二 数据结构——前置知识(二)

目录 1. 包装类 1.1 包装类的概念 1.2 基本数据类型和对应的包装类 1.3 装箱和拆箱 1.4 自动装箱和自动拆箱 1.5 练习 —— 面试题 2. 泛型 2.1 如果没有泛型——会出现什么情况&#xff1f; 2.2 语法 2.3 裸类型 1.没有写<> 但是没有报错为什么&#xff1f; …

Flutter Container组件、Text组件详解

目录 1. Container容器组件 1.1 Container使用 1.2 Container alignment使用 1.3 Container border边框使用 1.4 Container borderRadius圆角的使用 1.5 Container boxShadow阴影的使用 1.6 Container gradient背景颜色渐变 1.7 Container gradient RadialGradient 背景颜色渐…

Telegram平台分发其聊天机器人Grok

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

STM32 定时器输出比较深度解析:从原理到电机控制应用 (详解)

文章目录 定时器输出比较定时器通道结构输出比较通道(高级) PWM 信号原理输出比较 8 种工作模式互补输出概念极性选择内容 PWM硬件部分舵机直流电机及驱动简介 定时器输出比较 定时器通道结构 通道组成&#xff1a;定时器有四个通道&#xff0c;以通道一为例&#xff0c;中间是…

Python训练营打卡 Day38

Dataset和Dataloader类 知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 Dataset和Dataloader类 1. Data…

【机器学习基础】机器学习入门核心算法:K均值(K-Means)

机器学习入门核心算法&#xff1a;K均值&#xff08;K-Means&#xff09; 1. 算法逻辑2. 算法原理与数学推导2.1 目标函数2.2 数学推导2.3 时间复杂度 3. 模型评估内部评估指标外部评估指标&#xff08;需真实标签&#xff09; 4. 应用案例4.1 客户细分4.2 图像压缩4.3 文档聚类…

Python Day37

Task&#xff1a; 1.过拟合的判断&#xff1a;测试集和训练集同步打印指标 2.模型的保存和加载 a.仅保存权重 b.保存权重和模型 c.保存全部信息checkpoint&#xff0c;还包含训练状态 3.早停策略 1. 过拟合的判断&#xff1a;测试集和训练集同步打印指标 过拟合是指模型在训…

RabbitMQ集群与负载均衡实战指南

文章目录 集群架构概述仲裁队列的使用1. 使用Spring框架代码创建2. 使用amqp-client创建3. 使用管理平台创建 负载均衡引入HAProxy 负载均衡&#xff1a;使用方法1. 修改配置文件2. 声明队列 test_cluster3. 发送消息 集群架构 概述 RabbitMQ支持部署多个结点&#xff0c;每个…