首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高大型阵列的WCF性能

提高大型阵列的WCF性能
EN

Stack Overflow用户
提问于 2013-01-02 13:57:35
回答 2查看 1.8K关注 0票数 1

我们使用WCF将数据从服务器应用程序传输到多个客户端。实际上,对于大多数通信量,客户机和服务器都运行在同一台机器上,所以我希望传输速度非常快。

然而,当传输大数组(16位灰度图像)时,需要几秒钟才能传输数据。对于一个16 MB的图像,它需要大约3-5秒!

最初,我们使用ushort数组,因为它是最适合存储16位灰度图像数据的数据类型。然而,这是非常慢的:大约20-25秒,16 MB。在使用byte序列化之前,当我们将数据复制到Buffer.BlockCopy数组时,由于某种原因,数据将减少到3-5秒。但是,从一个应用程序传输16 MB到运行在同一台机器上的另一个应用程序的3-5秒对我来说仍然太长了!

因此,我的问题是:如何提高这种场景的性能?

我已经调查过Marc Gravell的protobuf-net,但是我不确定它在这个案例中是否会有帮助.有什么经验或其他建议吗?

下面是我们的一个数据类的源代码(包含图像数据):

代码语言:javascript
复制
[DataContract(IsReference = true)]
public class ImageData
{
    private ushort[] m_pixelData;

    public ushort[] PixelData
    {
        get
        {
            return m_pixelData;
        }
        set
        {
            m_pixelData = value;
            OnPropertyChanged("PixelData");
        }
    }

    [DataMember]
    public override byte[] FileData
    {
        get
        {
            if (this.PixelData == null)
            {
                return null;
            }

            return ListHelper.ConvertToByteArray(this.PixelData);
        }
        set
        {
            if (value == null)
            {
                this.PixelData = null;
                return;
            }

            this.PixelData = ListHelper.ConvertToUshortArray(value);
        }
    }

}

注意,只有FileData属性被标记为[DataMember],因此PixelData属性不会被序列化!

以下是服务器的app.config的相关部分

代码语言:javascript
复制
<system.serviceModel>
    <services>
        <service name="Services.ImageDataService" behaviorConfiguration="ServicesBehavior">
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://localhost:8008/ImageDataService" />
                </baseAddresses>
            </host>
            <endpoint address="" binding="netTcpBinding" bindingConfiguration="NetTcpBindingLargeFileTransfer" contract="Services.IImageDataService" />
            <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServicesBehavior">
                <serviceMetadata httpGetEnabled="false" />
                <serviceDebug includeExceptionDetailInFaults="false" />
                <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <bindings>
        <netTcpBinding>
            <binding
                name="NetTcpBindingLargeFileTransfer"
                openTimeout="00:01:00" closeTimeout="00:01:00" receiveTimeout="infinite" sendTimeout="infinite"
                transactionFlow="false" transactionProtocol="OleTransactions"
                transferMode="Buffered" hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="2097152" maxBufferSize="1073741824" maxConnections="10" maxReceivedMessageSize="1073741824">
                <readerQuotas
                    maxDepth="2147483647" maxStringContentLength="2147483647"
                    maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                <reliableSession ordered="true" inactivityTimeout="infinite" enabled="false" />
                <security mode="None">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                    <message clientCredentialType="Windows" />
                </security>
            </binding>
        </netTcpBinding>
    </bindings>
</system.serviceModel>

和客户的app.config

代码语言:javascript
复制
<system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding
                name="NetTcpBindingLargeFileTransfer"
                openTimeout="00:01:00" closeTimeout="00:01:00" receiveTimeout="infinite" sendTimeout="00:10:00"
                transactionFlow="false" transactionProtocol="OleTransactions"
                transferMode="Buffered" hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                maxBufferPoolSize="2097152" maxBufferSize="1073741824" maxConnections="10" maxReceivedMessageSize="1073741824">
                <readerQuotas
                    maxDepth="2147483647" maxStringContentLength="2147483647"
                    maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                <reliableSession ordered="true" inactivityTimeout="infinite" enabled="false" />
                <security mode="None">
                    <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                    <message clientCredentialType="Windows" />
                </security>
            </binding>
        </netTcpBinding>
    </bindings>
    <client>
        <endpoint
            address="net.tcp://localhost:8008/ImageDataService"
            binding="netTcpBinding"
            bindingConfiguration="NetTcpBindingLargeFileTransfer"
            contract="Services.IImageDataService"
            name="Services.IImageDataService"
            behaviorConfiguration="ServicesBehavior" />
    </client>
    <behaviors>
        <endpointBehaviors>
            <behavior name="ServicesBehavior">
                <dataContractSerializer maxItemsInObjectGraph="2147483647"></dataContractSerializer>
            </behavior>
        </endpointBehaviors>
    </behaviors>
</system.serviceModel>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-02 14:02:30

在同一台机器上尝试命名管道。

选择运输

票数 2
EN

Stack Overflow用户

发布于 2013-01-02 16:02:57

尝试使用命名管道传输流。有关详细信息,请参阅此帖子大数据量和流

在将数据发送到服务器/客户端之前,缓冲数据可能是一个问题。流将以块的形式发送数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14123365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档