Re: [问题] pointer的运算速度

楼主: pipidog (如果狗狗飞上天)   2014-02-27 07:39:56
你这个说法很笼统. 因为所谓的快慢,或是快几倍这种叙述前
提都是你有一个比较的运算(例如浮点跟整数,那我们可以说
整数运算明显更快).如果缺乏具体的运算.其实这种快慢的说
法没有意义.
所以当你问pointer运作起来有没有比较有效率这个叙述时,
你必须要讲清楚是相对于什么计算而言.比如说你去比较两个
变量a=1,b=1,a+b=? 这种问题,你把a,b用pointer取代做运算,
不可能比较快,事实上你甚至多了把a,b设成pointer的步骤,
总地来讲只会更慢.
所以C语言也好,fortran也罢,pointer有没有更有效率,都是
看你怎么用! 跟pointer这种型态本身的关系并不大.
那pointer有没有相对什么计算而言更有效率呢? 那你就必须
去了解pointer的意义. pointer主要的功用在于,用资料在记
忆体中的位址(四个整数)来取代资料本身.这样做有什么好处
呢?
"简化资料在内存中搬动的过程"
内存里面的每一笔资料要搬动都要经过很复杂的过程,首先
程式会先去读你的资料有多大,读完之后去跟内存要空间,
要完之后再把原本的资料复制过去.这个过程本身是很耗时间
的,尤其当资料结构越大越复杂的时候,更是如此.
这个时候pointer的优势就出来了,我们并不具体的搬动在记忆
体中的资料,而是把这些资料都用一个四码的索引代表.每一次
搬动资料时,我都只搬动索引而不去搬动资料本身.直到我真
的需要取出资料时,程式再透过这组索引去帮你把资料取出来.
这就是pointer的精神.
所以pointer特别适合使用的情况是:
复杂的资料结构,需要频繁的在内存搬动的时候.
这里提一下"复杂的资料结构"的意思.因为这些资料的索引,本
身是由四个整数组成的,所以比这个更复杂的资料,都可以看过
是复杂的资料结构.例如超过四位的整数,实数,复数,字串,或者
自订的结构变量都可以说是复杂的资料结构.
这时候如果你使用pointer来做搬动资料,除了让内存搬动的过
程减少了,还顺便让fortrn避开了直接接触自己较不擅长的,复杂
的资料结构的问题(fortran在处理结构变量,字串方面的效率使远
逊于C的,但在整数还有实数计算上,则优于C)而把问题转成了擅长
的整数问题.
这也就是说,如果你的资料并不复杂,那么不管你的搬动有多频繁,
用pointer都是多此一举.同样的道理,如果你的资料在内存中并
不需要做频繁的搬动,用pointer也是得不到好处的.甚至会完全拖
慢你的速度.
所以当你使用pointer之前只要问问自己三个问题就好了
1.我的资料在内存中的搬动频繁吗?
2.我的资料比四个整数更复杂吗?
3.现有的不使用pointer的程式不能给出满意的效率吗?
如果上面三个问题的答案都是yes,那么就大方的使用pointer吧.
*附注:
其实pointer也还以很多其他的应用,其中很多并不是出于内存
跟效率上做考量的,而是出于程式的需求来考量的.像这种时候,
我们就不该单纯从上面的问题来回答用pointer的好处.
不过既然你都说了你主要的使用是在阵列计算上,所以这些我就不
提了.等程式功力进步了,再慢慢摸索吧!
作者: kobeismyfans (kobeismyfans)   2014-02-27 20:48:00
感谢你的回复 顺带一问 四个整数是什么意思 四位数吗C=B+A 这样算是把资料搬动吗?
楼主: pipidog (如果狗狗飞上天)   2014-02-28 03:17:00
你要不要google一下,或查一下关于pointer是什么?
作者: PTT0207445 (我是乡民)   2014-03-10 02:34:00

Links booklink

Contact Us: admin [ a t ] ucptt.com