小编AyC*_*yCe的帖子

TCP_NODELAY如何影响连续的write()调用?

TCP_NODELAY是一个允许快速发送TCP数据包的选项,无论其大小如何.当速度很重要时,这是非常有用的选项,但是,我很好奇它会对此做些什么:

Socket socket = [some socket];
socket.setTcpNoDelay(true);
OutputStream out = socket.getOutputStream();
out.write(byteArray1);
out.write(byteArray2);
out.write(byteArray3);
out.flush();
Run Code Online (Sandbox Code Playgroud)

我试图找到什么冲洗实际上做了什么SocketOutputStream,但据我所知,它没有做任何事情.我曾希望它会告诉套接字"现在发送所有缓冲的数据",但不幸的是,不,它没有.

我的问题是:这些3字节数组是在一个数据包中发送的吗?我知道你对TCP构造网络数据包的方式没有多少控制权,但有没有办法告诉套接字(至少尝试)打包这些字节数组,这样可以避免网络开销?可以手动打包字节数组并在一次调用中发送它们以write帮助吗?

java sockets networking tcp

5
推荐指数
1
解决办法
1万
查看次数

挥发性的目的/优点

您将使用volatile关键字的具体情况是什么?更重要的是:该计划如何从中受益?

从我已经阅读和了解到的内容:volatile应该用于不同线程访问的变量,因为它们比非易失性线程读取的速度稍快.如果是这样,是否应该有一个关键字强制执行相反的操作

或者他们实际上是在所有线程之间同步?正常变量怎么样?

我有很多多线程代码,我想稍微优化一下.当然我不希望获得巨大的性能提升(无论如何我都没有任何问题),但我总是试图让我的代码更好.我对这个关键字感到有些困惑.

java concurrency multithreading

4
推荐指数
1
解决办法
2486
查看次数

C#成员方法作为静态方法("反向扩展方法")

是否可以在C#中获取对成员函数的引用而不指定对象,以便它可以像静态扩展方法一样使用,将对象作为第一个参数?

class Handler
{
    public void Add(int value) { ... }
}

static class HandlerExtensions
{
    public static void AddEx(this Handler instance, int value) { ... }
}


var x = new Handler();

// possible:
Action<int> func1 = x.Add;
Action<Handler, int> func2 = HandlerExtensions.AddEx;

// not possible?
Action<Handler, int> func3 = Handler::Add;
Run Code Online (Sandbox Code Playgroud)

我为什么要那样做?要指定在使用实际对象之前调用类的方法:

// current solution:
void RegisterDto<DataType>(Func<Handler, Action<DataType>> handler) { ... }
RegisterDto<int>(x => x.Add);

// desired solution:
void RegisterDto<DataType>(Action<Handler, DataType> handler) { ... }
RegisterDto<int>(Handler::Add); // …
Run Code Online (Sandbox Code Playgroud)

c# lambda extension-methods delegates function-pointers

2
推荐指数
1
解决办法
320
查看次数