百万数据加载查找测试

分别使用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的参考文章

 

 

 

posted @ 2022-05-17 16:45  Hxxxxxxyyyyyy  阅读(65)  评论(0编辑  收藏  举报