在 COBOL 中,您可以将子例程封装为嵌套程序或独立模块。我想知道这两种方法在执行速度、内存使用以及 CICS 中是否允许这两种方法方面有什么区别。任何参考都会很棒。运行环境是 Z/OS。
谢谢。
CICS 中允许使用这两种方法。
内存使用的差异(如果有的话)将可以忽略不计。编译器将生成可重入代码,因此您的工作存储将在每个 CICS 事务的第一次执行时动态分配,而您的本地存储将在每次执行时动态分配。语言环境内存分配算法旨在快速。CICS 区域中只有一份可执行代码副本。
将您的子例程打包为嵌套程序或在绑定时将模块静态链接在一起可以避免调用子例程时的 LOAD 开销。
将您的子例程打包为嵌套程序可防止它被其他程序调用,除非您将嵌套程序打包为副本并使用COPY
编译器指令将其带入您的程序中。这种技术可能会导致一些有趣的问题,例如对嵌套程序 copybook 的更改可能需要使用 copybook 重新编译所有程序才能获得新版本;但这取决于您的源代码管理系统。子程序的静态链接也有类似的问题。
如果将子例程打包为单独的模块,则可以选择通过EXEC CICS LINK
或 COBOL dynamic执行它CALL
。前者导致创建新的语言环境飞地,因此后者更有效,特别是在第二个和后续CALL
以及如果您指定语言环境运行时选项CBLPSHPOP (OFF)。
以上大部分内容都是从多年来的SHARE演示文稿中收集的。
一些调整信息可在 2002 S8213TR.PDF 的 SHARE 演示文稿中获得,目前可在此处获得(该信息仍然有效)。请注意,有许多与存储分配相关的语言环境运行时选项相关的调整机会。 存在许多不同的机制来设置语言环境选项。您的 CICS 系统程序员可能对此事有意见。可能有关于语言环境运行时选项的商店标准。
一般来说,大型机 CICS COBOL 应用程序调优与使用高效算法、变量定义、编译选项和语言环境运行时选项有关,而不是与应用程序打包有关。
除了cschneid提到的东西......
包含的程序可以引用在包含程序的数据部中使用 GLOBAL 属性声明的项目。包含的程序无需声明 GLOBAL 项即可引用它们。
不能使用 RECURSIVE 属性声明包含的程序。