/ui2/cl_json序列化的性能

/ui2/cl_json序列化的性能,json,abap,saprfc,pyrfc,Json,Abap,Saprfc,Pyrfc,在过去,我通过SAP RFC将其用于返回任何数据结构: json = /ui2/cl_json=>serialize( data = <lt_result> pretty_name = /ui2/cl_json=>pretty_mode-low_case ). json=/ui2/cl\u json=>序列化(数据= pretty_name=/ui2/cl_json=>pretty_mode-low_case)。 如果很小,这种方法效果很好,但对于较大的数据

在过去,我通过SAP RFC将其用于返回任何数据结构:

json = /ui2/cl_json=>serialize( data = <lt_result> 
    pretty_name = /ui2/cl_json=>pretty_mode-low_case ).
json=/ui2/cl\u json=>序列化(数据=
pretty_name=/ui2/cl_json=>pretty_mode-low_case)。
如果
很小,这种方法效果很好,但对于较大的数据集,这种方法很慢


如何通过通用ABAP RFC功能模块返回任何数据结构?我使用PyRFC,但这对这个问题没有多大影响。

这可能会更好:

DATA(lo_json_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).

CALL TRANSFORMATION id
                    SOURCE result = <lt_result>
                    RESULT XML lo_json_writer.

ev_json_data = lo_json_writer->get_output( ). " yours export parameter
DATA(lo_json_writer)=cl_sxml_string_writer=>create(type=if_sxml=>co_xt_json)。
调用转换id
源结果=
结果XML lou_json_writer。
ev_json_data=lo_json_writer->get_output()。“您的导出参数

摘自。

这可能会表现得更好:

DATA(lo_json_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).

CALL TRANSFORMATION id
                    SOURCE result = <lt_result>
                    RESULT XML lo_json_writer.

ev_json_data = lo_json_writer->get_output( ). " yours export parameter
DATA(lo_json_writer)=cl_sxml_string_writer=>create(type=if_sxml=>co_xt_json)。
调用转换id
源结果=
结果XML lou_json_writer。
ev_json_data=lo_json_writer->get_output()。“您的导出参数”

摘自。

如果性能对您来说是最重要的,那么/ui2/cl\u json是错误的选择。而它是一个ABAP代码和SAP_BASIS 700兼容语法。 就性能而言,调用转换id更好。这也是用英文写的。顺便说一句:我是/ui2/cl_json的作者

但如果它涉及灵活性、舒适性、受支持的数据类型和所需的格式,那么目前没有比/ui2/cl_-json更好的解决方案

使用调用转换和自己的XSLT转换,可能会得到一些更好的、专门化的实现,但它已经比id转换慢了,并且会花费更多的编码工作

通过放弃对较低版本(低于7.40)的支持并使用内置SXML解析器处理json,仍然有可能使/ui2/cl_json更快,但这将是一些工作要做。我没有时间/实际的要求


@Sandra Rossi:我很乐意为/ui2/cl_json应用任何性能建议,所以如果您有具体的示例,请发送给我。在这里或在博客上。但请考虑到目前我需要遵守SAP基础7.00的限制。

如果性能对您来说是最重要的,那么/ui2/cl\u json是错误的选择。而它是一个ABAP代码和SAP_BASIS 700兼容语法。 就性能而言,调用转换id更好。这也是用英文写的。顺便说一句:我是/ui2/cl_json的作者

但如果它涉及灵活性、舒适性、受支持的数据类型和所需的格式,那么目前没有比/ui2/cl_-json更好的解决方案

使用调用转换和自己的XSLT转换,可能会得到一些更好的、专门化的实现,但它已经比id转换慢了,并且会花费更多的编码工作

通过放弃对较低版本(低于7.40)的支持并使用内置SXML解析器处理json,仍然有可能使/ui2/cl_json更快,但这将是一些工作要做。我没有时间/实际的要求


@Sandra Rossi:我很乐意为/ui2/cl_json应用任何性能建议,所以如果您有具体的示例,请发送给我。在这里或在博客上。但请考虑到,目前我需要遵守SAP_BASIS 7.00的限制。

您能解释一下为什么这会表现更好吗?我将于周日返回办公室,并进行性能测试。希望在那之前有人能回答你。我很放松。不用着急。我可以等。@guettli我想这可能是一个逻辑假设,因为
/ui2/cl_json
使用ABAP(字节码)进行序列化,而
调用转换
在内核级别(可能是C代码或close)进行序列化,即解释的字节码比C代码慢。但这必须得到验证,因为调用转换将首先进行XML序列化,然后转换为JSON。@guettli最后我做了一个SAT分析/ui2/cl_json=>serialize执行了两次,比标准语法更差。您能解释一下为什么它会执行得更好吗?我将在周日回到办公室,并将进行性能测试。希望在那之前有人能回答你。我很放松。不用着急。我可以等。@guettli我想这可能是一个逻辑假设,因为
/ui2/cl_json
使用ABAP(字节码)进行序列化,而
调用转换
在内核级别(可能是C代码或close)进行序列化,即解释的字节码比C代码慢。但这必须得到验证,因为调用转换将首先进行XML序列化,然后转换为JSON。@guettli最后我做了一个SAT分析/ui2/cl_json=>serialize执行了两次,比标准语法更糟糕。您能给出“小/快”和“大/慢”的度量吗?它只是关于序列化的持续时间还是仅仅关于RFC数据传输的持续时间?我快速查看了
/ui2/cl_json
,我认为它可以优化:例如,有些事情做了多次,可以存储到内存中以供重用(方法转储符号),在任何地方,字符串的连接方式都不是最优的(cf),有时中间结果会无用地存储在临时内部表中(追加+连接行)。因此,也许值得编写自己的代码?@SandraRossi如果我通过rfc返回,那么我可以在sap之外的应用程序中创建json(python通过pyrfc)。。。。我将在这里报告我的结果。非常感谢您的详细调查。您能给出“小/快”和“大/慢”的措施吗?这只是关于序列化的持续时间还是仅仅关于RFC数据传输的持续时间?我快速查看了
/ui2/cl_json
的代码,我认为它可以优化