c++ - 为什么通过 gSOAP 发送二进制数据太慢了?

标签 c++ web-services qt gsoap

我正在尝试使用 gSOAP Web 服务和 C++ 将图像从客户端应用程序发送到服务器。为此,我正在使用 Qt,我的客户端和服务器应用程序可以在 Windows 和 Linux 上运行。令人惊讶的是,对于一个 1MB 的 jpg 图像,将图像从客户端发送到运行在 Linux 和 Windows 平台上的同一台机器上的服务器大约需要 6 秒。我的应用程序是否有问题或任何其他 Web 服务技术是否需要相同的时间?

附言为了发送数据,我使用了 unsigned char * 类型。

编辑 1: 如何使用 base64 数据类型通过 gSOAP 发送二进制数据。在我阅读文档时,.stub 文件中没有可用的数据类型。

最佳答案

XSD base64Binary 类型是 XML 架构原生原始二进制类型。禁用 -DDEBUG 时性能应该非常好(因为消息记录很慢!)。

gSOAP 工具生成高效的 XML 序列化程序,这些序列化程序通过网络推送和拉取 base64,同时直接从/向原始数据转换。

以下是典型系统的一些数字,假设网络开销较低:

  • 回显 1K base64 100 次(即使用 1K base64 的 200 条消息):
    经过的实时时间 = 140(毫秒)CPU 时间 = 120 用户 = 40 系统 = 80
  • 回显 100K base64 100 次(即使用 100K base64 的 200 条消息):
    经过的实时时间 = 820(毫秒)CPU 时间 = 450 用户 = 280 系统 = 170
  • 回显 1MB base64 100 次(即使用 1MB base64 的 200 条消息):
    经过的实时时间 = 5650(毫秒)CPU 时间 = 3730 用户 = 2740 系统 = 990

网络带宽可能是影响您表现的一个因素。

附言。您可能想尝试使用 SOAP_IO_CHUNK 进行分块传输。一种更激进的方法是更改​​ SOAP_BUFLEN(通常为 64K)以优化套接字缓冲区大小(并重新编译包含 stdsoap2.h 的所有源代码以确保使用新的缓冲区大小).

关于c++ - 为什么通过 gSOAP 发送二进制数据太慢了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34282236/

相关文章:

c++ - 确定 TCP 套接字的状态

C++ SDL 运动播放器 "duplication"?

web-services - 在 Web 应用程序和桌面应用程序之间集成身份验证

Java Axis 客户端创建双安全 header

qt - 如何从 QTableView 获取当前编辑器?

c++ - 我想在 qt 中单击(向左或向右)小部件时显示一条消息

c++ - 使用 soundtouch 库在 iOS 中检测 BPM

c++ - 无法返回 CMap

jquery - 我可以通过 webService 调用获取 gridview 的渲染 html 吗?

c++ - QtMainWindow 初始化事件