Ain*_*vri 9 macos iso dvd dmg performance-testing
有没有人知道模拟慢速DVD驱动器的任何可行方法,例如通过安装的DMG/ISO映像?
目标是针对慢速驱动进行编程,从而满足模拟要求.任何想法将不胜感激!
更新:再次,目标是模拟缓慢的I/O流程.不幸的是,Network Conditioner或Charles等工具无法提供解决方案.涓涓细流已经过时,没有更积极的开发:(
使用 hdiutil,您可以在特制的 HTTP 服务器上挂载磁盘映像,但您无法控制操作系统缓存,并且 I/O 慢速不会是细粒度的。我建议两种非网络解决方案。
您可以减慢 I/O 系统调用,例如通过DYLD_INSERT_LIBRARIES. 这种方法非常简单,这是我首先尝试的方法。
read(2)您只需使用以下实现创建一个库pread(2):
/* slow.c */
#define SLEEP_TIMESPEC {0, 25000000} // 25ms
ssize_t
read(int fildes, void *buf, size_t nbyte) {
struct timespec s = SLEEP_TIMESPEC;
(void) nanosleep(&s, NULL);
return (ssize_t) syscall(SYS_read, fildes, buf, nbyte);
}
ssize_t
pread(int d, void *buf, size_t nbyte, off_t offset) {
struct timespec s = SLEEP_TIMESPEC;
(void) nanosleep(&s, NULL);
return (ssize_t) syscall(SYS_pread, d, buf, nbyte, offset);
}
Run Code Online (Sandbox Code Playgroud)
您可能还需要实施readv(2). 您只需将此 C 代码编译为共享库,并设置DYLD_INSERT_LIBRARIES为在运行程序之前加载该库。您可能还需要定义DYLD_FORCE_FLAT_NAMESPACE. 看dyld(1)。
clang -arch i386 -arch x86_64 -shared -Wall slow.c -o slow.dylib
Run Code Online (Sandbox Code Playgroud)
(该库是通用编译的,因为我在磁盘上的 AIR 应用程序实际上是 i386,而不是 x86_64)。
要测试该库,只需执行以下操作:
env DYLD_INSERT_LIBRARIES=slow.dylib DYLD_FORCE_FLAT_NAMESPACE=1 cat slow.c
Run Code Online (Sandbox Code Playgroud)
您可能想要尝试使用高于 25ms 的值cat,例如 1 秒,可以将其内联为{1, 0}。同样,您应该从命令行启动应用程序:
env DYLD_INSERT_LIBRARIES=slow.dylib DYLD_FORCE_FLAT_NAMESPACE=1 path/to/YourApp.app/Contents/MacOS/YourApp
Run Code Online (Sandbox Code Playgroud)
这会减慢每次读取调用的速度(即使是通过更高级别的 API)。但是,某些读取操作不会受到影响(例如mmap(2)),并且您可能希望减慢某些文件的 I/O 速度,但不想减慢其他文件的速度。后一种情况可以通过捕获来处理open(2),但需要更多的工作。
每次读取访问 25 毫秒足以使任何 AIR 应用程序明显变慢。当然,您应该根据您的需要调整该值。
或者,您可以实现 Fuse 插件。如果您从 LoopbackFS( C或ObjC)开始,这会特别容易。
事实上,您可以非常轻松地调用nanosleep(2)方法readFileAtPath:userData:buffer:size:offset:error:或loopback_read函数。
| 归档时间: |
|
| 查看次数: |
372 次 |
| 最近记录: |