我正在开发一个类似FTP的程序,将大量小文件下载到Xbox 360 devkit(使用Winsock),并将其移植到Playstation3(也是一个devkit,并使用linux AFAIK).该程序使用BSD样式的套接字(TCP).两个程序都与同一服务器通信,下载相同的数据.该程序循环遍历循环中的所有文件,如下所示:
for each file
send(retrieve command)
send(filename)
receive(response)
test response
receive(size)
receive(data)
在Xbox 360实现上,整个下载需要1:27,最后一次发送和第一次接收之间的时间大约需要14秒.这对我来说似乎很合理.
对于相同的数据,Playstation3实现需要4:01.瓶颈似乎介于最后一次发送和第一次接收之间,占用了当时的3:43.网络和磁盘时间都明显少于Xbox 360.
这两个devkits都与我的PC处于同一个交换机上,后者执行文件服务,并且所述交换机上没有其他流量.
我试过设置TCP_NODELAY标志,这并没有显着改变.我也尝试将SO_SNDBUF/ 设置SO_RCVBUF为625KB,这也没有显着影响时间.
我假设Winsock和linux之间的TCP/IP堆栈实现之间存在差异; 是否有一些套接字选项,我可以设置使Linux实现更像Winsock?还有什么我不考虑的吗?
唯一的解决方案是重写它,以便它将所有文件请求一起发送,然后全部接收它们.
不幸的是,索尼的实现没有TCP_CORK选项,所以我不能说这是不同的.
我有一个控制台模式程序,它使用SQLite3来维护数据库文件.执行需要一段时间,但假设数据库写入发生,它应该在任何时候都是安全的取消.(这都是在Windows下)
从运行程序的角度来看,CtrlC在控制台中命中比让另一个程序调用TerminateProcess更安全吗?
我注意到如果调用TerminateProcess,我可以获得数据库损坏 - 我认为这是因为程序没有机会完成写入.我的猜测是CtrlC更好,因为程序得到一个信号并终止自己,而不是操作系统杀死它.
请注意,程序实际上并不处理信号(除非SQLite这样做); 我在谈论Win32可执行文件的内置默认机制来处理CtrlC信号.
澄清/简化问题 - 鉴于此写操作刚刚执行:
fwrite(buf, 1024*1024, 1, stream);
Run Code Online (Sandbox Code Playgroud)
在写这篇文章期间,TerminateProcess的行为会不同于CtrlC?
如何在每个月的第31天(或30日或29日)为每个月复发的事件指定一个事件的套期,如果月份没有足够的天数则选择最接近的事件(即2月它会选择28日或29日,四月会选择第30名)?
从技术上讲,我正在使用rrule javascript库,如果这是相关的.
要添加上下文,我有一个表单,用户可以指定开始日期重复(每年,每月,每周,每天),就像账单一样.如果账单通常在30日到期,那么在2月将到期,这将是28日(或29日).
我正在尝试在打字稿中使用承诺。我使用 tsd 安装 es6-promise 并添加了对我的文件的引用。它在很大程度上理解承诺,但我很难将它们与then.
function foo() : Promise<any> {
var p: Promise<any> = Promise.resolve();
var x: Promise<any> = Promise.resolve();
p = p.then(x);
return p;
}
Run Code Online (Sandbox Code Playgroud)
在以下位置给我这个p.then(x):
错误 TS2345:“Promise”类型的参数不可分配给“(value: any) => {}”类型的参数 | 可<{}>'。
这是类型定义中的错误,还是我使用错误?
javascript ×2
console ×1
networking ×1
playstation ×1
promise ×1
rrule ×1
signals ×1
sockets ×1
typescript ×1
windows ×1
winsock ×1
xbox360 ×1