作者pipidog (如果狗狗飞上天)
看板Fortran
标题Re: [问题] pointer的运算速度
时间Thu Feb 27 07:39:56 2014
你这个说法很笼统. 因为所谓的快慢,或是快几倍这种叙述前
提都是你有一个比较的运算(例如浮点跟整数,那我们可以说
整数运算明显更快).如果缺乏具体的运算.其实这种快慢的说
法没有意义.
所以当你问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的好处.
不过既然你都说了你主要的使用是在阵列计算上,所以这些我就不
提了.等程式功力进步了,再慢慢摸索吧!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 169.237.42.117
※ 编辑: pipidog 来自: 128.120.178.119 (02/27 11:29)
1F:推 kobeismyfans:感谢你的回覆 顺带一问 四个整数是甚麽意思 四位数吗 02/27 20:48
2F:→ kobeismyfans:C=B+A 这样算是把资料搬动吗? 02/27 20:50
3F:→ pipidog:你要不要google一下,或查一下关於pointer是什麽? 02/28 03:17
4F:推 PTT0207445:推 03/10 02:34