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帮助吗?
您将使用volatile关键字的具体情况是什么?更重要的是:该计划如何从中受益?
从我已经阅读和了解到的内容:volatile应该用于不同线程访问的变量,因为它们比非易失性线程读取的速度稍快.如果是这样,是否应该有一个关键字强制执行相反的操作?
或者他们实际上是在所有线程之间同步?正常变量怎么样?
我有很多多线程代码,我想稍微优化一下.当然我不希望获得巨大的性能提升(无论如何我都没有任何问题),但我总是试图让我的代码更好.我对这个关键字感到有些困惑.
是否可以在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)