在程序中,不断地call一个程序,有什么办法提高速度?
在看注意事项的时候,有提到:
在do-loop中要避免任何的call,可是有时call是必要的,比如客户需要修改日期时:
这样在循环中要不断地call这个程序来修改日期;
方法上有说将它写进datapool,这个是什么意思?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
明白了,谢谢,
本帖最后由 franliu 于 2010-07-23 23:18 编辑
回复 1# first_come
如果你可以修改被call的程序,那么可以将那个程序写成有两种退出方式。一种是让*inlr 保持 *off 的状态,用return退出,另一种是将 *inlr设成 *on 再退出。
怎样退出可以由传入的参数控制。
在最后一次调用的时候,选择让 *inlr = *on 再退出。
这样程序就可以长驻在内存中,文件保持打开状态,变量不被系统自动初始化。运行就快得多了。
谢谢passthru!!!我去IBM的iseries infocenter去找找看有没有相关资料,总之学习了。。。
好高深,看不明白,惭愧....等我多看几遍,里面有些概念不明...呵呵,谢谢
本帖最后由 passthru 于 2010-07-22 11:24 编辑
楼主的题很有代表性,往往是做400开发非常缺乏的深究学习,甚至包括一些资历非常深的开发人员和总体和概要设计人员。
不是在loop中就不能用call。
首先,要掌握400环境下的call有几种方法,这些call之间的公共和差异。还有熟悉call的运行机制。再进一步深化,就是0S400的支持。
call的方式有1)动态的call;2)callb,pgm内modules的静态调用;3)callp不同pgm之间静态moudles的调用。从字面上就知道,静态调用,速度比动态调用快,因为静态调用在编译pgm时,os400就通过db2400把调用关系prototype,原型接口,记录下来,modules之间的关系也通过指针的形式在os400用户信息表中进行登记。在静态调用时,调用路径已经存在os400表中。然而,动态调用,调用关系如果没有在pgm中直接定义,os400就会自动到libl中查找排序在第一个位置的obj(*pgm),就是说,os400会消耗系统资源进行临时路径查找。
无论调用关系式call、callb、或callp,在第一次进入pgm时,os400都会初始化H表中的系统支持定义、D表中的变量,都会把pgm的目标代码通过pool装入到内存中。如果在pgm结束,没有设置*inlr为*on,即释放pgm上述的系统资源,而仅仅用return,这时,这个pgm在下次重新进入时,OS400会自动保留上次pmg的运行环境,即H和D表的定义,而不必重新装载这些定义;保留ODP的路径和状态。这时,重新进入,只需reset D表中的变量;从新设置表中的指针。
对上述说法,可能会进一步提问,那么程序代码呢?是否还存在pool中,或者内存中?
如果在编写pgm代码时,用到AG,或者通过系统命令把pgm装载到内存中,这时pgm就一直保留在内存中,程序代码无需通过硬盘-pool-内存,反复进入,而仅仅是物理内存上的电子开发操作,这时,PGM在os下保持最高速度的响应和运行。
如果还要进一步提高pgm的运行效率,通过procedures的modules的并发,即多线程处理,除了pgm的编写技能和模式,还需OS400的设置和支持。这又是另外一个话题了。
call一次就进入memory了,是不是qingzhou他们说的那个setobjacc?