与MS.NET相比,Mono下XSockets的性能较差 鉴于

与MS.NET相比,Mono下XSockets的性能较差 鉴于,mono,xsockets.net,Mono,Xsockets.net,我使用的是XSockets 3.0.6,我认为它是最新的稳定版本。在MS.NET下,行为与预期一致。在Ubuntu 14.04和Mono 3.6.1上,虽然服务器在向客户端发送消息之前有一些延迟 问题 在MS.NET上,当我在客户端键入字符串并发送它时,所有客户端都会立即收到通知。在Mono上,虽然服务器收到消息,但未立即通知客户端。只有一条消息,我等了5分钟,客户仍然没有得到通知。当消息变为5-6时,所有客户端将立即收到所有消息的通知。服务器似乎使用了某种缓冲,但有条件地使用,这取决于.NET

我使用的是XSockets 3.0.6,我认为它是最新的稳定版本。在MS.NET下,行为与预期一致。在Ubuntu 14.04和Mono 3.6.1上,虽然服务器在向客户端发送消息之前有一些延迟

问题 在MS.NET上,当我在客户端键入字符串并发送它时,所有客户端都会立即收到通知。在Mono上,虽然服务器收到消息,但未立即通知客户端。只有一条消息,我等了5分钟,客户仍然没有得到通知。当消息变为5-6时,所有客户端将立即收到所有消息的通知。服务器似乎使用了某种缓冲,但有条件地使用,这取决于.NET运行时,这很奇怪

问题: 我做错什么了吗?如何更改代码,以便像在MS.NET中那样立即通知所有客户端

代码 我遵循(并稍微修改)快速入门示例,如下所示

服务器 初始化 客户
在raspberry pi上运行XSockets时,我亲身经历了这一点。 经过一些调查,我意识到这与pi是单核的事实有关,内部队列直到5条消息被发送进来才发送消息。。。。然后所有的信息都被发送出去了

你的计算机有多少核

这个问题在4.0中得到了解决(现在使用alpha)

编辑:我只在使用Mono的单核机器上遇到过这个问题,在我的Mac Book Air上,Mono上的一切都很好

看起来XSockets中没有禁用。在System.Net.Sockets中,您可以通过将属性设置为
true
来禁用Naggle算法。
我不熟悉XSockets,但如果您可以从XSockets获取底层System.Net.Sockets.Socket类,您可以将此属性设置为
true
,避免发送延迟。

我将Ubuntu 14.04用作虚拟机。它有3个核心。我写了一些简单的多线程代码,它成功地利用了所有的CPU核心。非常有趣!让我换一种说法。它在4个核上运行良好,但在1个核上运行不好。。。当我们在阻塞集合上使用GetConsumingEnumerable时,单核计算机上会出现此问题。我没有任何小于4芯的机器,因此我无法测试:(想知道4.0 alpha在3个cors上是否与您的行为相同。您想要它吗?如果需要,请给我发一封电子邮件。)uffe@xsockets.netXSockets仅在使用MS.NET的Windows主机操作系统上运行良好。在我的虚拟Ubuntu机器上,它延迟了客户端通知,正如所解释的。我编写的简单多线程代码与X无关Sockets-我这样做只是为了确保mono进程可以利用所有可用的内核,并且我的mono设置没有问题。此外,我重新启动了我的VM,并为它分配了4个(而不是3个)核心-问题仍然存在。我没有在OSX上测试它,因为我没有Mac,只有Mono+Ubuntu。而且,正如你所说,转到4.0而不是3.0.7是很合理的。我给你发了一封电子邮件,大约4.0。MS.NET和Mono中的套接字都将
节点延迟设置为
false
,但行为仍然不同。设置prMono中的
true
属性无效。
NoDelay=false
的行为不同,因为操作系统使用TCP缓冲的工作方式不同。甚至Ubuntu上的Mono和Debian上的Mono在
NoDelay=false
上也有不同的行为。在从服务器发送数据之前,你设置了
NoDelay=true
吗?我指的是示例行为。虽然我明白你的意思。当第一次客户端->服务器调用
NoDelay=false
时,我将其设置为
true
,然后我从服务器向所有客户端发送数据。来自同一客户端的后续客户端->服务器调用具有
NoDelay=true
。问题仍然存在。我已更新了我的问题to说明代码的外观-添加在
CustomController
类中。我在使用Arch Linux的VBox上遇到了相同的问题(1个内核)。刚刚切换到4个内核,将检查它的运行情况。您是否检查了问题是否仍然存在?该问题在最新的XSockets 4.0 alpha 2中已修复。
using (var container = Composable.GetExport<IXSocketServerContainer>())
{
    container.StartServers();

    foreach (var server in container.Servers)
    {
        Console.WriteLine(server.ConfigurationSetting.Endpoint);
    }

    Console.Write("Started! Hit 'Enter' to quit.");
    Console.ReadLine();

    container.StopServers();
}
public class CustomController : XSocketController
{
    public override void OnMessage(ITextArgs textArgs)
    {
        Console.WriteLine ("No delay = {0}", this.Socket.Socket.NoDelay);
        if (!this.Socket.Socket.NoDelay)
        {
            Socket.Socket.NoDelay = true;
        }

        Console.WriteLine("Received {0} about {1}.", textArgs.data, textArgs.@event);
        this.SendToAll(textArgs);
    }
}
var client = new XSocketClient("ws://127.0.0.1:4502/CustomController", "*");

client.OnOpen += (sender, eventArgs) => System.Console.WriteLine("OPEN");
client.Bind("foo", message => System.Console.WriteLine(message.data));
Thread.Sleep(1000);
client.Open();

string input;
System.Console.WriteLine("Type 'quit' to quit and any other string to send a message:");
do
{
    input = System.Console.ReadLine();
    if (input != "quit")
    {
        client.Send(input, "foo");
    }
} while (input != "quit");