精华内容
下载资源
问答
  • 今天又有一位朋友和我在MSN上聊起了AS3中存取数据效率的话题,突然想起以前曾在blueidea论坛上讨论过。这个话题还有蛮多人感兴趣,比较实用,让它在论坛上沉下去有些可惜。因此特地整理成帖,希望对大家有用。废话少...

    今天又有一位朋友和我在MSN上聊起了AS3中存取数据效率的话题,突然想起以前曾在blueidea论坛上讨论过。这个话题还有蛮多人感兴趣,比较实用,让它在论坛上沉下去有些可惜。因此特地整理成帖,希望对大家有用。废话少说,看蕉:
    使用如下几种存取数据方式进行存取100万次运算,所花时间依次为(单位为毫秒,ms):

    如下几种存取数据方式100万次存取运算效率依次为:

    * 类定义中的属性(如public、private类属性) 135 毫秒
    Point类对象 140 毫秒
    Rectangle类对象(x等属性) 140ms
    * Array类对象 270ms
    * Object类对象 500 ms
    动态类动态属性 550
    * Rectangle类对象(left等属性) 700
    * 自定义类getter/setter 1000
    自定义类Function 1000
    (以上测试结果是由eidiot测试的,感谢eidiot。稍微做了一点文字修改。见讨论原帖

    问题1:为什么会有速度差别?

    最快的是第一类,速度是Array的两倍,Object的四倍,getter/setter的约八倍。存取坐标要用Point和Rectangle,比Array快的多。 Object和动态类效率较低,一般情况下请尽量使用密封类。 

    测试用的自定义类是密封类,那么,public等类定义中定义好的属性比Array和Object快是正常的。因为查询密封类的类成员(包括属性和方法)只需要查询TraitObj,加一个 prototype obj。而Array, Object都是动态类,不论是内存分配和name lookup都需要额外的开销。
    同理,Point、Rectangle也是密封类,当然比Array和Object要快。
    这是AS3新的内部实现机制的优点。如果在AS2.0中,则不会有差别。注,AS2的密封类和动态类的支持只存在于编译阶段,在运行时没有区别,无法区分。
    有兴趣的朋友可以试试将AS3自定义类设成动态类,再使用动态属性和非动态属性存取10万次比较看看。

    问题2:为什么有些类的属性效率会存在差异?比如Rectangle的x属性和left属性为何差别这么大?

    Rectangle类除了x,y,width,height,其余属性全部是getter和setter,不是真正的属性。使用getter和setter时,函数调用需要一些开销,自然比真正的属性要慢一些。

     

    问题3:为何动态类和密封类的类定义中的成员效率没有差别?

    这个是正常的。并不费解。之前想问有没有区分动态成员和非动态成员,就是要弄清这个问题。
    只要是我们在类定义中定义的成员(包括属性和方法),都在这个类对应的Trait obj中。动态类和密封类都一样。因此,密封类和动态类的属性,方法效率都会相同。具体的实现是通过Slot方式来实现,通过slot index来访问,效率高。

    问题4:动态成员的效率和非动态成员的效率为何有差距?AS2中为何没有这样的区别?

    因为动态类的动态属性不存在与trait obj中,而是在prototype obj中一个类似于哈希表的数据结构中。哈希表代价是name lookup效率明显低于slot方式,而且生成时系统的开销较大。因此AS3中,动态类的动态成员效率低于类定义中定义的成员。在AS2中,动态属性和非动态属性的区别只存在于编译阶段,运行时并没有区别。因为运行时,实质上所有对象成员都是以name为索引,name都存储在一张hash table(哈希表)中。所以AS2中没有AS3效率高,也没有这些区别。

    问题5:private成员和public成员效率有没有差别?

    访问private成员和访问public成员不会更快。实际上public, private, protected, internal等只是AS3中内嵌的四个命名空间而已,并不会对访问速度产生差异。他们在Trait obj中都是同样使用slot来存储的,访问也都是通过slot index。理论上说,我们使用自定义的命名空间来修饰类成员,那么这个类成员的访问速度也应该和内嵌的命名空间一样。有兄弟感兴趣的话,可以继续试试使用自定义命名空间来测试一下。

    有趣的发现:看测试结果,似乎Rectangle实现的getter和setter速度,要比一般的getter和sette和自定义function要快300。这个真是很有趣。

    解释:AS3中不少核心类的方法都是native(关键字)实现,即最终的实现是由AVM语言自然代码(native code)实现,而不是ActionScript代码实现。比如Object类,Class类等等,他们的方法都是native的,由相应的C++代码实现。因此,会比我们自定义类的效率要高不少。

    黑羽可以肯定的是,核心类中的实现都是native code。但是,Rectangle类的功能并不复杂,而且处于flash.geom包,非核心类。我在想,难道连这个类的方法也是native实现吗?
    如果测试多次也是这样,并且测试方法无偏差,那么基本上可以肯定Rectangle类中也是使用了native code。
    那么做一个推论,是否只要是Flash API的类基本上都是由native code实现呢?
    建议使用其他包中的类,也测试一下他们的getter和setter。如果Flash API中类的getter和setter速度一致,且比自定义类的快,那么大概可以下结论,所有Flash Player API(包括核心类和非核心类)真的都是用native code实现的。


    展开全文
  • 接着,vector里面大量的虚构和构造够电脑受的了,如果需要高性能,还是自己new delete一些,vector主要面向方便。而且,leetcode的代码应该是debug模式运行的?vs编译器本来就会对最后的代码调优,debug还原了很多...

    https://oj.leetcode.com/problems/longest-palindromic-substring/

    这个leetcode得出的,可能是这个原因,后面慢慢找出结果

    const_reference operator[](size_type _Pos) const
    { // subscript nonmutable sequence
    return (*(begin() + _Pos));
    }

    reference operator[](size_type _Pos)
    { // subscript mutable sequence
    return (*(begin() + _Pos));
    }

    这个是stl里面的vector的[]操作,看上去是没差别啊,直接得到位移,不过我也觉得可能是因为vector需要预分配控件,而这个leetcode这个控件确实也是预分配的啊,搞不懂,后面有时间看看源码,有人测在debug下和release下结果不一样,debug下比release下多出10倍时间。

    后面继续找一下这个原因。

    ————————————————————————————————————

    接着,vector里面大量的虚构和构造够电脑受的了,如果需要高性能,还是自己new delete快一些,vector主要面向方便。而且,leetcode的代码应该是debug模式运行的?vs编译器本来就会对最后的代码调优,debug还原了很多调试信息,所以慢很多

    而且最重要的原因是,我vector是循环嵌套的  like this vector<vector<int>>

    这样会慢很多,多用数组吧。


    ————————————————————————————————————————————

    接着,最新看到的

    慢的原因是数据存储的局部性问题(data locality):

    1) 使用二位数组Depart[500][21]的时候,所有数据在内存中是连续存放的。访问内存时,内存访问的局部性较强,Cache命中的概率较大。L1 Cache访问延迟只有几个指令周期,而内存访问延迟则达到几百个指令周期。

    2)Vector中的数据是连续存放的,但是Vector本身只保存指向数据块的指针。Vector建立在栈上,保存数据的数据块在堆上。因此二位动态数组Vector <Vector<int>>中,指向行的所有指针是连续存放的。每个行的数据是连续存放的,但是行与行之间是不连续存放的。因此跨行访问时局部性降低,Cache命中率下降。所以用时间更多。

    改进方案。提升数据局部性:
    typedef int line[21];
    Vector<line> Depart;

    展开全文
  • 最近几天大数据量的处理,不知道是使用List还是Map好,在网上看了好多,看到最多的说是使用Map,但是最后我还是决定写了一个测试类,来看看他们之间速度的快慢。 package com.zl.mybatis.plus; import java.util.*...

    最近几天大数据量的处理,不知道是使用List还是Map好,在网上看了好多,看到最多的说是使用Map,但是最后我还是决定写了一个测试类,来看看他们之间速度的快慢。

    package com.zl.mybatis.plus;
    
    
    import java.util.*;
    
    public class Main {
    
        public static void main(String arg[]) {
            Map<Integer, User> userMap = new HashMap<>();
            List<User> list = new ArrayList<>();
            for (int i = 0; i < 1000000; i++) {
                User user=new User();
                user.setName("name" + i);
                user.setSex("女");
                user.setMath(60);
                user.setChinese(120);
                user.setEnglish(60);
                userMap.put(i, user);
                list.add(user);
            }
            Long el = System.currentTimeMillis();
          for (User user : list) {
                int math = user.getMath();
                int chinese = user.getChinese();
                int english = user.getEnglish();
                int sum = math + chinese + english;
            }
            Long ej = System.currentTimeMillis();
            System.out.println("list for-each时间差:" + (ej - el));
            System.out.println("**********************************************");
    
            Long e = System.currentTimeMillis();
            int size=list.size();
            for (int i=0;i<size;i++){
                User user=list.get(i);
                int math = user.getMath();
                int chinese = user.getChinese();
                int english = user.getEnglish();
                int sum = math + chinese + english;
            }
            Long le = System.currentTimeMillis();
            System.out.println("list时间差:" + (le - e));
            System.out.println("**********************************************");
    
            Long l = System.currentTimeMillis();
            for (Map.Entry<Integer,User> entry : userMap.entrySet()) {
                User user=entry.getValue();
                int math = user.getMath();
                int chinese = user.getChinese();
                int english = user.getEnglish();
                int sum = math + chinese + english;
            }
            Long ll = System.currentTimeMillis();
            System.out.println("map时间差:" + (ll - l));
    
        }
    }
    

    二 测试结果
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 存取图片有什么好办法没 我存base64位 取得时候太了 !!
  • 栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。...堆是垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是
    栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 
    Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。 
    栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 
    栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义: 
    int a = 3; 
    int b = 3; 
    编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。 
    这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。 
    要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。 
    String是一个特殊的包装类数据。可以用: 
    String str = new String("abc"); 
    String str = "abc"; 
    两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。 
    而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。 
    比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。 
    String str1 = "abc"; 
    String str2 = "abc"; 
    System.out.println(str1==str2); //true 
    可以看出str1和str2是指向同一个对象的。 
    String str1 =new String ("abc"); 
    String str2 =new String ("abc"); 
    System.out.println(str1==str2); // false 
    用new的方式是生成不同的对象。每一次生成一个。 
    因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。 
    另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。 
    由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。 
    ====================================================================================================================
    Java虚拟机提供了程序运行时环境,运行时环境中最重要的一个资源是运行时数据区。 
    运行时数据区是操作系统为Java虚拟机进程分配的内存区域,并由虚拟机管辖,同时这块区域又分为若干个子区域, 
    主要包括堆区、方法区和Java栈区。 
    在堆区中存放对象, 
    在方法区存放类的类型信息,类型信息包括静态变量和方法信息,方法信息中包含类的所有方法的字节码。 

    栈,有个特点,先进去的后出来,里边放的是进程中正在执行的方法, 
    比如说方法 


    public void A(){ 
        B(); 

    public void B(){ 
        C(); 

    public void C(){ 


    假设一个程序只调用A()方法,(开始时栈是空的): 

    程序运行的时候,先执行A()方法,因为A方法调用了B()方法,这时因为A()没有执行完,中断A()方法,将其放入栈中暂存,(此时因为栈原来是空的,A方法被push进栈后,位于栈底),执行B()方法,执行时因为B方法调用了C()方法,此时中断B方法的执行,将B()方法push入栈,由于栈中已经有A方法,B被push进去后,位于A的上面;C()方法执行完后,去栈中查找位于栈顶的方法,查到是方法B,方法B继续执行,执行完后再去栈中查找位于栈顶的方法,此时栈内只又一个方法,那就是方法A,方法A有继续执行,A执行完后,栈中已经没有方法,程序运行结束。 

    假设下边这个柱状的东西是栈 
    ----------------------------------- 
    |  | 
    |B()|---位于栈口最近的方法先被pop出来执行完成 
    |A()|---栈底的方法最后执行完 
    ——— 

    ==================================================================================================================
    java 的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。 
    栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 

    基本数据类型存储在“栈”中,对象引用类型实际存储在“堆”中,在栈中只是保留了引用内存的地址值。 
    =================================================================================================================
    栈中的数据占内存大小在编译时是确定的,比如一个int类型就占4B,所以变量地址好计算,所以分配和销毁和访问速度都比较快. 
    堆中的数据占内存大小一般在编译时是不确定的,在运行时才能知道大小,所以其地址只有在运行时计算,而且运行时可能占内存大小还有变动,所以对这样的数据的分配,销毁和访问都非常不方便,速度也慢一些. 
    ===================================================================================================================
    栈里放的是地址,堆里可以放数据也可以放地址(想象下堆里的东西也有可能指向别的地方) 
    每个地址都会指向给定的数据,不然就没有存在的必要了,同样的道理,堆中的数据没有被指针指向的话,也没有存在的必要了,所以当obj=null时就释放内存了。 
    Java有个好处就是没有指针,Java中的传递的都是传引用,不像c++还能传地址,比如指针p++和p+1两个的结果完全不同。 
    ====================================================================================================================
    栈是编译时分配空间,而堆是动态分配(运行时分配空间),所以栈的速度快 
    cpu有专门的寄存器(esp,ebp)来操作栈,堆都是使用间接寻址的。栈快点。 
    展开全文
  • 下面是网络中流传最广的一篇sql查询速度慢的原因及解决方法的文章,其对于处理mysql的慢查询有借鉴作用。由于此文转载多次,很难找到最开始的原文链接,就附送本人最先看到此文的链接:...
  • 随机存取、顺序存取、随机存储和顺序存储这四个概念是完全不一样的,切不可将之混淆 很多人包括我可能认为随机存取就是随机存储,顺序存取就是顺序存取,其实不是这样。 下面完整的介绍一下这4个概念 存取结构:...
  • Hbase的读写速度,写比读

    千次阅读 2019-11-07 21:35:20
    首先,需要明确的是,Hbase写入速度比读取速度,根本原因LSM存储引擎https://blog.csdn.net/qq_41946557/article/details/102961610 不过简单来说:当你在hbase中写入数据的时候,什么时候算写入,很明显,写入...
  • Oracle查询速度慢的原因总结

    万次阅读 2018-07-10 16:51:29
    查询速度慢的原因很多,常见如下几种:1,没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2,I/O吞吐量小,形成了瓶颈效应.3,没有创建计算列导致查询不优化.4,内存不足5,网络速度慢6,查询出的数据量...
  • 最近在看王道论坛的数据结构书籍,开头部分提到了随机存取、顺序存取、随机存储和顺序存储的区别。 于是博主在网上查询了相关资料对随机存取、顺序存取、随机存储和顺序存储的区别进行详细解释。 二、详细解释 1....
  • RAM随机存取存储器

    千次阅读 2010-09-25 20:37:00
    存储单元的内容可按需随意取出或存入,且存取速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。 按照存储信息的不同,随机存储器又分为静态随机存储器...
  • Window7开机速度有点的解决办法

    万次阅读 2011-09-03 11:48:13
    硬盘中有一个很宠大的数据交换文件,它是系统预留给虚拟内存作暂存的地方,很多应用程序都经常会使用,所以系统需要经常对主存储器作大量的数据存取,因此存取这个档案的速度便构成影响计算机快慢的非常重要因素!...
  • 主存存取原理 目前计算机使用的主存基本都是随机读写存储器(RAM),现代RAM的...每个存储单元有唯一的地址,现代主存的编址规则比较复杂,这里将其简化成一个二维地址:通过一个行地址和一个列地址可以唯一定位...
  • 1、ArrayList 有序集合 底层为数组 按下标查找 增删 按元素查找、增删都 2、LinkedList 有序集合 底层为链表 按下标查找 增删 按元素查找 增删比arrayList 3、HashMap 无序哈希表 底层哈希表 按下标...
  • 数据库查询速度慢的原因

    千次阅读 2009-07-13 15:31:00
    ●查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络...
  • 最近公司分配了一个任务,测试一个向数据库存入千万级数据工具的效率及所...于是乎首先测试已存在的工具的存取效率,结果如下:  mysql 数据库:  1万条数 据耗时8分钟  5万条数 据耗时42分钟  远程连接orac
  • 网络支付海量数据存取处理的研究

    千次阅读 2011-11-13 22:50:18
    本文从针对网络支付带来的海量数据带来的问题,通过改进和优化数据库配置、数据分割、数据分类、处理算法、数据访问、虚拟内存和文本格式处理等方面,对网络支付带来的海量数据存取处理进行研究,提出了几个可行性的...
  • 查询速度慢的原因:   1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)    2、I/O吞吐量小,形成了瓶颈效应。   3、没有创建计算列导致查询不优化。    4、内存不足   5...
  • 往显示设备的framebuffer里写1080i的视频数据速度特别,拷贝一帧要200ms左右,部分代码如下: for(j=0; j; j++) { memcpy(dst,pplaybuf,controlSystem.width*sizeof(unsigned int)); dst+=finfo.line...
  • 又因为内存就一套地址译码和片选装置,刷新与存取有相似的过程,它要选中一行,这期间片选线、地址线、地址译码器全被占用着。所以刷新与存取不能并行。同理,刷新操作之间也不能并行,意味着一次只能刷一行。 ...
  • 计算机主存和磁盘存取原理

    千次阅读 2018-03-13 16:49:38
    主存存取原理目前计算机使用的主存基本都是随机读写存储器(RAM),现代RAM的结构和存取原理比较复杂,这里本文抛却具体差别,抽象出一个十分简单的存取模型来说明RAM的工作原理。图5从抽象角度看,主存是一系列的...
  • 查询速度慢的原因很多,常见如下几种:    1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)    2、I/O吞吐量小,形成了瓶颈效应。    3、没有创建计算列导致查询不优化。   ...
  • 程序员通常倾向于认为...然而,你的处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存.我们将上述这些存取单位称为内存存取粒度. Figure 2. 处理器是如何看内存的...
  • 但是刻录速度突然变得好,一个半小时才刻一张盘,去电脑城问,电脑城的老板叫我把硬盘全格了,再重装系统,我没有按他的做,后来上网找到了方法,原来只是光驱及硬盘的数据传输速度默认模式关闭,按这个方法一试就...
  • SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:  1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)  2、I/O吞吐量小,形成了瓶颈效应。  3、没有创建计算列导致查询不...
  • delphi使用ADO在sql数据库存取图片的方法 新手参考,老鸟绕行 我一直不认为能把代码写的和天书一样的程序员是好的程序员,那不过是因为我真的对delphi也就是略懂皮毛,太深了看不懂。 网上查询数据库存取图片的...
  • SQL Server查询速度慢的原因有很,常见的有以下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 ...
  • 电脑速度的原因及处理方法

    千次阅读 2008-07-20 10:40:00
    对于关机的解释: 1.开始 运行msconfig回车,启动,勾选杀毒软件,防火墙,输入法ctfmon三个其他的勾都去掉,确定,关闭,重起电脑看看 2.下载关机加速补丁,然后直接导入注册表在XP中关机时,系统会发送消息...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,157
精华内容 31,662
关键字:

存取速度由快到慢