• 百万数据加载查找测试


    分别使用Array、Object、Map存储长度为一百万的数据,然后进行取值/查找,记录耗时,推算其性能。

    使用浏览器进行测试:

    Chrome 已是最新版本
    版本 101.0.4951.67(正式版本) (64 位)
     
    • 测试代码如下:
    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
        <title>数组,字典,Map取值速度测试</title>
    
    </head>
    
    <body>
        打开控制台查看
        <script type="text/javascript">
            // 数组,字典,Map取值速度测试
    
            // 创建测试项
            function createItem(index) {
                return {
                    id: 'id' + index,
                    ['filedA' + index]: 'valueA' + index,
                    ['filedB' + index]: 'valueB' + index,
                    ['filedC' + index]: 'valueC' + index,
                    ['filedD' + index]: 'valueD' + index
                }
            }
    
            const Length = 1000000
    
            // 数组查找
            function listQuery(id, list) {
                for (let index = 0; index < list.length; index++) {
                    const element = list[index];
                    if (element.id === id) {
                        return element
                    }
                }
            }
            function listFind(id, list) {
                return list.find(item => { return item.id === id })
            }
    
            function test(iii) {
                const list = []
                const dic = {}
                const map = new Map()
    
                console.group('性能测试' + iii)
    
                console.group('赋值性能测试')
    
                console.time('数组赋值')
                for (let index = 0; index < Length; index++) {
                    const item = createItem(index)
                    list.push(item)
                }
                console.timeEnd('数组赋值')
    
                console.time('字典赋值')
                for (let index = 0; index < Length; index++) {
                    const item = createItem(index)
                    dic[item.id] = item
                }
                console.timeEnd('字典赋值')
    
                console.time('map赋值')
                for (let index = 0; index < Length; index++) {
                    const item = createItem(index)
                    map.set(item.id, item)
                }
                console.timeEnd('map赋值')
    
                console.groupEnd('赋值性能测试')
    
                console.group('查找取值性能测试')
    
                console.time('数组取值-索引')
                console.groupCollapsed('取值结果')
                console.log(list[0]) // 第一个
                console.log(list[Length / 2]) // 中间
                console.log(list[Length - 1]) // 最后一个
                console.log(list[Length + 1]) // 不存在的
                console.groupEnd('取值结果')
                console.timeEnd('数组取值-索引')
    
                console.time('数组取值-find')
                console.groupCollapsed('取值结果')
                console.log(listFind('id0', list)) // 查找第一个
                console.log(listFind(`id${Length / 2}`, list)) // 查找中间
                console.log(listFind(`id${Length - 1}`, list)) // 查找最后一个
                console.log(listFind(`id${Length + 1}`, list)) // 查找不存在的
                console.groupEnd('取值结果')
                console.timeEnd('数组取值-find')
    
                console.time('数组取值-for遍历')
                console.groupCollapsed('取值结果')
                console.log(listQuery('id0', list)) // 查找第一个
                console.log(listQuery(`id${Length / 2}`, list)) // 查找中间
                console.log(listQuery(`id${Length - 1}`, list)) // 查找最后一个
                console.log(listQuery(`id${Length + 1}`, list)) // 查找不存在的
                console.groupEnd('取值结果')
                console.timeEnd('数组取值-for遍历')
    
                console.time('字典取值')
                console.groupCollapsed('取值结果')
                console.log(dic['id0']) // 查找第一个
                console.log(dic[`id${Length / 2}`]) // 查找中间
                console.log(dic[`id${Length - 1}`]) // 查找最后一个
                console.log(dic[`id${Length + 1}`]) // 查找不存在的
                console.groupEnd('取值结果')
                console.timeEnd('字典取值')
    
                console.time('Map取值')
                console.groupCollapsed('取值结果')
                console.log(map.get('id0')) // 查找第一个
                console.log(map.get(`id${Length / 2}`)) // 查找中间
                console.log(map.get(`id${Length - 1}`)) // 查找最后一个
                console.log(map.get(`id${Length + 1}`)) // 查找不存在的
                console.groupEnd('取值结果')
                console.timeEnd('Map取值')
    
                console.groupEnd('查找取值性能测试')
    
                console.groupEnd('性能测试' + iii)
            }
    
            for (let index = 0; index < 5; index++) {
                test(index)
            }
        </script>
    </body>
    
    </html>
    View Code
    • 加载页面后可在控制台查看耗时(截取单次打印结果如下):

    赋值时间:Array ≈ Object < Map

    取值/查询时间:Map ≈ Object ≈ Array索引 <<  Array for查询 < Array find查询

    • 内存占用

    使用Google Chrome devtools的Memory查看内存占用。

    由于Length = 1000000时,内存占用过大Snapshot的时候出不了结果,因此改为10000测试。

    一百万时候可查看整体的内存占用,运行中占用1078M,夸张:

    运行结束后,内存回收后只占2.4M

     改为10000的时候,将变量存至全局变量,查看变量的内存占用,如下:

     变量的内存占用(10000时的参考):Object < Array ≈ Map

    •  小结

    对比Object和Map的参考文章

  • 相关阅读:
    除草第一季 1 简单日常心得
    [搬家from qzone] 读书笔记 人间情味.半成品
    [搬家from qzone] 读书笔记 最好的告别
    [搬家from qzone] 读书笔记 爱是一种选择
    [搬家from qzone] 读书笔记 童年的王国
    [搬家from qzone] 我不是一个很好的学长,所以毕业前,给学习学妹们写写自己犯的错误吧
    博客重新开张 第一篇灌水
    我眼中的vim
    linux启动kdump失败
    centos7 minimal安装之后要做的事情
  • 原文地址:https://www.cnblogs.com/dullfish/p/16281429.html
Copyright © 2020-2023  润新知