You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于TypeScript+D3.js的排序算法可视化应用内存测量需求

实现排序算法可视化中的内存占用统计

核心思路

要展示排序时的内存占用,我们可以利用Chromium内核浏览器(Chrome/Edge等)支持的performance.memory API获取内存数据,重点统计两个实用指标:

  • 排序过程中的峰值内存占用(最能反映算法的内存开销)
  • 排序前后的内存使用增量

代码修改实现

以下是加入内存统计逻辑后的完整按钮点击事件代码:

let sortingInProgress = false
let timeInfo = '0.00 s'
let memoryInfo = '0 MB'
let peakMemory = 0
let memorySampler: number | null = null

const sortingPromise = new Promise<void>(resolve => {
    START_BUTTON.addEventListener('click', async () => {
        if (sortingInProgress) {
            console.log('stopped')
            return
        }
        sortingInProgress = true
        START_BUTTON.disabled = true
        SELECT_DATA_SIZE.disabled = true
        SELECT_SORTING_ALGORITHM.disabled = true

        // 初始化内存统计
        if (!performance.memory) {
            memoryInfo = '浏览器不支持内存统计'
        } else {
            const initialMemory = performance.memory.usedJSHeapSize
            peakMemory = initialMemory
            // 启动内存采样定时器,每10ms记录一次峰值
            memorySampler = window.setInterval(() => {
                const currentMemory = performance.memory.usedJSHeapSize
                if (currentMemory > peakMemory) {
                    peakMemory = currentMemory
                }
            }, 10)
        }

        const startTime = performance.now()
        const sort = SelectAlgorithm(data, algorithmType)
        await sort(updateBars)
        const endTime = performance.now()

        // 停止采样并计算内存数据
        if (memorySampler) {
            clearInterval(memorySampler)
            memorySampler = null
            // 转换为MB单位(1MB = 1024*1024字节)
            const peakMemoryMB = (peakMemory / (1024 * 1024)).toFixed(2)
            const memoryDeltaMB = ((peakMemory - performance.memory.usedJSHeapSize) / (1024 * 1024)).toFixed(2)
            memoryInfo = `峰值: ${peakMemoryMB} MB | 增量: ${memoryDeltaMB} MB`
        }

        const totalTime = ((endTime - startTime) / 1000).toFixed(2)
        timeInfo = `${totalTime} s`

        resolve()
    })
})

sortingPromise.then(() => {
    svg.selectAll('rect').style('fill', 'black')
    sortingInProgress = false
    SELECT_DATA_SIZE.disabled = false
    SELECT_SORTING_ALGORITHM.disabled = false
    SORT_TIME.textContent = timeInfo
    // 假设页面有一个用于展示内存的DOM元素,比如id为memory-info的span
    if (typeof MEMORY_INFO !== 'undefined') {
        MEMORY_INFO.textContent = memoryInfo
    }
})

关键细节说明

  • 内存采样逻辑:用定时器定期采样内存数据,确保能捕获排序过程中的内存峰值(单次采样无法反映动态变化的内存情况)
  • 兼容性处理:先判断performance.memory是否存在,避免在不支持的浏览器上抛出错误
  • 单位转换:将浏览器返回的字节数转换为用户更易读的MB单位
  • DOM展示:需要在页面中添加一个用于显示内存信息的元素(例如<span id="memory-info"></span>),并在代码中对应引用

注意事项

  • performance.memory是Chromium专属的非标准API,Firefox等浏览器暂不支持;若需更广兼容,可尝试使用PerformanceObserver监听内存性能条目,但兼容性仍有限
  • 采样间隔可按需调整:间隔越小统计越精准,但会带来轻微性能开销,10ms是兼顾精度与性能的均衡选择

内容的提问来源于stack exchange,提问作者IvonaK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:50:35