【发布时间】:2020-10-07 16:06:44
【问题描述】:
上下文
我正在编写一个通过标准输入和标准输出与 C# 程序通信的 Java 程序。 C# 程序作为子进程启动。它通过标准输入获取“请求”并通过标准输出发送“响应”。请求非常轻量(几个字节大小),但响应很大。在程序的正常运行中,响应量约为 2GB 数据。
我正在寻找提高性能的方法,我的测量结果表明写入标准输出是一个瓶颈。以下是正常运行的数字:
- 总时间:195 秒
- 通过标准输出传输的数据:2026MB
- 写入标准输出所花费的时间:85 秒
- 标准输出吞吐量:23.8 MB/s
顺便说一句,我首先将所有字节写入内存缓冲区,然后将它们一次性复制到标准输出,以确保我只测量标准输出的写入时间。
问题
在 C# 子进程和 Java 父进程之间共享数据的一种高效且优雅的方式是什么?很明显,标准输出是不够的。
我在这里和那里阅读过有关通过内存映射文件共享内存的信息,但 Java 和 .NET API 给我的印象是我找错地方了。
【问题讨论】:
-
也许考虑一个命名管道,或者(可能是你能得到的最快的,但更复杂的是编排)一个内存映射文件。有一些库可以访问 Java(当然还有 C#)。
-
您可以将响应内容保存为文件或缓存,然后在响应中包含指向此内容的指针