使用字符串或将数据移动到固定字段哪个更快
Which is faster using string or moving data to fixed fields
传统上,COBOL 通过在由字段和填充符组成的工作存储中定义一个数据结构来写入打印输出,然后代码使用 MOVE 动词将要打印的数据移动到字段(当然存在变体)。
一种可能的替代方法是使用 STRING 动词来构造输出行记录。
我的目标平台是 IBM ENTERPRISE COBOL,我目前无法访问它!该程序预计 运行 使用数百万条记录,并且在编码开始之前做出决定是至关重要的。我正在考虑 STRING 选项,因为它更灵活,并且将来可能允许在不更改代码的情况下更改打印行格式,这是一种现实的可能性,但不是具体要求。
我的问题是: 我预计,但不能确定,STRING 会花费大量 CPU 时间。使用 STRING 而不是 MOVE 会导致程序显着变慢(比如超过 20%)吗?
我知道这个问题不是很精确,我不希望任何人有一个确切的答案,除非那个人做过类似的测试,但也许某个地方有人做过类似的测试并且有一个很好的猜测在那个测试中。
谢谢。
STRING var DELIMITED BY SIZE into var-2
必须 几乎与 MOVE
一样快,因为它通常归结为相同的 CPU 指令。它甚至可以更快,因为 STRING
不进行任何类型转换,而 MOVE
会进行(这是 MOVE
具有“更多功能”的地方)。
添加到 STRING
的短语越多(这当然通常是“更强大”的命令),在 运行 时间需要完成的工作就越多,因此速度会变慢,但是如果你自己做同样的事情(比如递增位置计数器),那么直接在一个语句中这样做会更快。
对于性能来说,“围绕它”的代码实际上做了什么可能更重要,“打印”听起来像文件 io(最好是文件,可能是 DB2)——这就是您需要调整的地方为了性能,而不是 MOVE
与 STRING
- 只需使用最合适的方法来完成任务 - 并注意使用 USAGE DISPLAY
直接进入“打印”的变量,和对于计数器和计算,最合适的 USAGE
(可能是 COMP
的有符号整数)。
一如既往:确保获得最佳性能的唯一方法是实际 测试 在目标机器上.
不要试图过度优化您的源代码以获得更好的性能。恕我直言,编写更易于理解和维护的代码比试图通过预测将使用哪些机器指令来提高性能的棘手代码更可取。
我不是在反驳西蒙的回答,只是修改一下。现代编译器在将 (COBOL) 源语句转换为机器指令时发挥了不可思议的魔力。我特别谈论 IBM 的 Enterprise COBOL for z/OS,因为我在这方面有一些工作经验。除了优化级别之外,您还可以选择目标架构级别,即处理器代,代码应该针对该级别进行优化。根据这些设置,可能会为相同的源代码生成完全不同的机器指令序列。这对运行时性能的影响可能比使用一个代码序列对另一个代码序列的影响要大得多。
我并不是说选择 STRING 而不是 MOVE 是过度优化。
传统上,COBOL 通过在由字段和填充符组成的工作存储中定义一个数据结构来写入打印输出,然后代码使用 MOVE 动词将要打印的数据移动到字段(当然存在变体)。
一种可能的替代方法是使用 STRING 动词来构造输出行记录。
我的目标平台是 IBM ENTERPRISE COBOL,我目前无法访问它!该程序预计 运行 使用数百万条记录,并且在编码开始之前做出决定是至关重要的。我正在考虑 STRING 选项,因为它更灵活,并且将来可能允许在不更改代码的情况下更改打印行格式,这是一种现实的可能性,但不是具体要求。
我的问题是: 我预计,但不能确定,STRING 会花费大量 CPU 时间。使用 STRING 而不是 MOVE 会导致程序显着变慢(比如超过 20%)吗?
我知道这个问题不是很精确,我不希望任何人有一个确切的答案,除非那个人做过类似的测试,但也许某个地方有人做过类似的测试并且有一个很好的猜测在那个测试中。
谢谢。
STRING var DELIMITED BY SIZE into var-2
必须 几乎与 MOVE
一样快,因为它通常归结为相同的 CPU 指令。它甚至可以更快,因为 STRING
不进行任何类型转换,而 MOVE
会进行(这是 MOVE
具有“更多功能”的地方)。
添加到 STRING
的短语越多(这当然通常是“更强大”的命令),在 运行 时间需要完成的工作就越多,因此速度会变慢,但是如果你自己做同样的事情(比如递增位置计数器),那么直接在一个语句中这样做会更快。
对于性能来说,“围绕它”的代码实际上做了什么可能更重要,“打印”听起来像文件 io(最好是文件,可能是 DB2)——这就是您需要调整的地方为了性能,而不是 MOVE
与 STRING
- 只需使用最合适的方法来完成任务 - 并注意使用 USAGE DISPLAY
直接进入“打印”的变量,和对于计数器和计算,最合适的 USAGE
(可能是 COMP
的有符号整数)。
一如既往:确保获得最佳性能的唯一方法是实际 测试 在目标机器上.
不要试图过度优化您的源代码以获得更好的性能。恕我直言,编写更易于理解和维护的代码比试图通过预测将使用哪些机器指令来提高性能的棘手代码更可取。
我不是在反驳西蒙的回答,只是修改一下。现代编译器在将 (COBOL) 源语句转换为机器指令时发挥了不可思议的魔力。我特别谈论 IBM 的 Enterprise COBOL for z/OS,因为我在这方面有一些工作经验。除了优化级别之外,您还可以选择目标架构级别,即处理器代,代码应该针对该级别进行优化。根据这些设置,可能会为相同的源代码生成完全不同的机器指令序列。这对运行时性能的影响可能比使用一个代码序列对另一个代码序列的影响要大得多。
我并不是说选择 STRING 而不是 MOVE 是过度优化。