java培训吧 关注:116,359贴子:396,798

编程语言可不可以不要数据结构全部散列

只看楼主收藏回复

程序语言现在大多数是类class Person{ String name,int age} 这样的
可不可以不要这种class的概念,全部用Map ,
比如这种就是Map personMap,
personMap.push("name","张三")
Person p=new Person("张三",12);

Map p=new HashMap()
p.push("name","张三");
p.push("age",12);
这样哪个效率高?
我个人估计肯定第一种高一些,那么第二种有没有办法效率提升到和第一种一样


1楼2015-10-21 13:54回复
    通过 JIT 生成优化过的机器码,后者的效率就可以接近前者。目前主流的 JavaScript 引擎都有 JIT,必不可少的就是对这种 hash 的优化,然而思路反而是在 JIT 时将结构类似的 hash 分成一类,模拟一个 class(因为 class 的内存布局固定,可以省略查表的开销),比如 V8 的 hidden class。


    2楼2015-10-21 16:12
    回复
      广告
      立即查看
      通过 JIT 生成优化过的机器码,后者的效率就可以接近前者。目前主流的 JavaScript 引擎都有 JIT,必不可少的就是对这种 hash 的优化,然而思路反而是在 JIT 时将结构类似的 hash 分成一类,模拟一个 class(因为 class 的内存布局固定,可以省略查表的开销),比如 V8 的 hidden class。


      3楼2015-10-21 16:13
      回复
        像题目里说的 Map p=new HashMap(),然后再 push 成员的时候,在 V8 里就是每 push 一个成员,就为这种布局创建一个新的 hidden class(里面的成员可以是连续排列的)。下一次创建新的一个 hash 的时候,会从现有的 hidden class 里找对应,如果对应上了就用这个 hidden class 作为底层的布局,相同的 hidden class 的对象可以共用生成好的机器码,在需要引用成员的时候用 inline cache,先检查 hidden class 有没有改变,然后直接得知成员的 offset,不需要计算 hash 和查表。而且对于像 JavaSript 这样对象这个 “hash” 里面可以放函数(方法)的,在调用方法的时候可以直接跳到 routine 所在地址,确认底层类型对上了之后直接执行机器码,省略了查表 -> 找 routine 地址的步骤。


        4楼2015-10-21 16:18
        回复
          JavaScript 里一般是事先在构造函数 / Object literal 中将所有成员创建好才能体现出 hidden class 的优化效果,如果在创建了一大堆只有 name 和 age 的对象之后,突然在构造函数外的地方给一个对象加了一个 weight 的成员,或者来了一个布局和之前的 pattern 有点不同的对象,或者修改了成员的类型(比如 JavaScript 中虽然语言上只有浮点数,但是 JavaScript 引擎往往会分开整数和浮点数,当成员从整数变成浮点数的时候 hidden class 就会改变)怎么办呢?这个时候它的 hidden class 会改变,在 inline cache 的类型检查那一步就会挂掉(bailout),之前生成好优化过的机器码就不能再用了,一种可能的手段是退回到原来的大哈希表,根据 profiling 的数据再寻找重新创建 hidden class / inline cache 的时机(可能是立刻也可能是在达到某个热点的标准之后


          5楼2015-10-21 16:24
          回复
            像题目里说的 Map p=new HashMap(),然后再 push 成员的时候,在 V8 里就是每 push 一个成员,就为这种布局创建一个新的 hidden class(里面的成员可以是连续排列的)。下一次创建新的一个 hash 的时候


            6楼2015-10-21 16:29
            回复
              比如 JavaScript 中虽然语言上只有浮点数,但是 JavaScript 引擎往往会分开整数和浮点数,当成员从整数变成浮点数的时候 hidden class 就会改变


              7楼2015-10-21 16:35
              回复
                像题目里说的 Map p=new HashMap(),然后再 push 成员的时候,在 V8 里就是每 push 一个成员,就为这种布局创建一个新的 hidden class(里面的成员可以是连续排列的)。


                8楼2015-10-21 16:40
                回复
                  广告
                  立即查看
                  #对初学者的友好程度跟OCaml其实是一个级别的,不过还好有个牛逼点的IDE扛着,再加上.NET平台,还是能把他们甩几公里。


                  9楼2015-10-21 16:46
                  回复
                    学过scala 学过F#
                    最大的感觉就是F#占用资源(REPL 小程序运行的开销)比scala省很多啊……
                    typeprovider是神器 FSharp.Data是大杀器
                    Fshart.Chart做个图很快


                    10楼2015-10-21 16:48
                    回复
                      学过scala 学过F#
                      最大的感觉就是F#占用资源(REPL 小程序运行的开销)比scala省很多啊……
                      typeprovider是神器 FSharp.Data是大杀器
                      Fshart.Chart做个图很快


                      11楼2015-10-21 16:49
                      回复
                        一点基础都没有,该如何自学


                        来自iPhone客户端12楼2015-10-21 17:36
                        回复
                          加油吧,能熬夜就熬,不行就好好休息抽时间学吧


                          来自iPhone客户端13楼2015-10-21 18:00
                          回复
                            求源代码楼主,能给我发一下么?毕竟学弟是学渣


                            来自iPhone客户端14楼2015-10-21 18:04
                            回复
                              广告
                              立即查看
                              感谢楼主 我只是水个经验,不要介意哈


                              来自iPhone客户端15楼2015-10-21 18:06
                              回复