我在这里阅读有关JavaScript输出缓冲的内容,并且试图让我的头脑绕过作者所说的在打印1到1,000,000网页时最快的脚本.(向下滚动到标题"获胜的一百万个数字脚本".)稍微研究一下后,我有几个问题:
(我意识到这可能是CS101,但我是那些受过抨击的,自学成才的黑客之一,而且我希望能从这一方面的集体智慧中受益.谢谢!)
我在emacs中打开了一个缓冲区.我想要一个函数,t
如果当前缓冲区包含字符串将返回,否则返回nil
.
(defun buffer-contains-substring (string)
...
)
Run Code Online (Sandbox Code Playgroud) 我通过加载文件并通过FileInputStream> BufferedInputStream> DataInputStream方法将字节输入AudioTrack.write()来在我的Android手机上播放WAV.音频播放效果很好,如果是,我可以轻松调整采样率,音量等,性能良好.然而,一首曲目开始播放大约需要两秒钟.我知道AudioTrack有一个不可避免的延迟,但这太荒谬了.我每次播放曲目都会得到:
03-13 14:55:57.100: WARN/AudioTrack(3454): obtainBuffer timed out (is the CPU pegged?) 0x2e9348 user=00000960, server=00000000
03-13 14:55:57.340: WARN/AudioFlinger(72): write blocked for 233 msecs, 9 delayed writes, thread 0xba28
Run Code Online (Sandbox Code Playgroud)
我注意到,每次播放曲目时,延迟的写入次数会增加一次 - 即使是在多个会话中 - 从手机开机之时起.块时间始终为230 - 240ms,考虑到此设备上的最小缓冲区大小为9600(9600/44100),这是有意义的.我在互联网上的无数次搜索中看到了这个消息,但它通常似乎与不播放音频或跳过音频有关.就我而言,这只是一个延迟的开始.
我正在高优先级的线程中运行我的所有代码.这是我正在做的截断但功能正常的版本.这是我的播放类中的线程回调.再次,这是有效的(现在只播放16位,44.1kHz,立体声文件),它只需要永远启动并且每次都有获取缓冲/延迟写入消息.
public void run() {
// Load file
FileInputStream mFileInputStream;
try {
// mFile is instance of custom file class -- this is correct,
// so don't sweat this line
mFileInputStream = new FileInputStream(mFile.path());
} catch (FileNotFoundException e) {
// log
}
BufferedInputStream mBufferedInputStream …
Run Code Online (Sandbox Code Playgroud) 在切换和显示缓冲区时,是否可以通过每个emacs帧获取相关缓冲区的子集
我的意思是
绑定到GL_ARRAY_BUFFER或GL_ELEMENT_ARRAY_BUFFER的顶点缓冲区对象是否有最大大小?
最初,我正在绘制一个由16个子网格组成的网格.对于每个子网格,我创建了一个顶点缓冲区,在渲染阶段,我调用了glDrawElements.这在iOS模拟器上运行良好,但是当我尝试渲染到我的设备时,屏幕不断闪烁并且不显示网格.
然后我做了一些阅读,发现在渲染阶段你不应该多次调用glDrawElements.我试图将所有子网格组合成一个顶点缓冲区.绑定到GL_ARRAY_BUFFER的缓冲区包含3969个顶点,其中每个顶点包含20个浮点数.所以这个缓冲区的大小是317520字节.与GL_ELEMENT_ARRAY_BUFFER绑定的指数是16425空头.因此,该缓冲区的大小为32850字节.
在OpenGL维基上,它表示对于顶点缓冲对象,"根据一个nVidia文档,1MB到4MB是一个不错的大小".
我在绑定每个缓冲区对象并调用glDrawElements之后打印出glGetError的结果,我没有看到任何错误.但是,我的网格没有正确显示.似乎只有第一个网格被正确绘制.我实施这个方法有什么可疑之处吗?我不想让这个问题太长,所以如果有任何额外的信息你需要回答这个问题让我知道.如果理论上没有什么似乎是错误的,也许我只是在实施它时犯了一个错误.
编辑:我发现seq_file
很容易从内核向用户空间写入大量数据.我正在寻找的是相反的; 一个API,便于从用户空间读取大量数据(多个页面).
编辑2:我正在实现一个<stdio.h>
作为内核模块的端口,它能够打开/proc
(以及后来的其他虚拟文件系统),类似于FILE
s并处理类似的输入和输出<stdio.h>
.你可以在这里找到这个项目.
我发现了很多关于内核如何将大量数据写入/ proc(用于用户空间程序)的问题,但没有其他方面.让我详细说明:
这个问题基本上是关于输入被标记化的算法(例如int
s或混合int
和字符串等),假设数据可能在多个缓冲区之间被打破.
例如,假设以下数据被发送到内核模块:
12345678 81234567 78123456 67812345 5678 1234 45678123 3456 7812 23456781
Run Code Online (Sandbox Code Playgroud)
并且为了这个例子,假设Linux提供/ proc处理程序的页面大小是20字节(相对于真正的4KB).
从/ proc(在内核模块中)读取数据的函数然后查看数据:
call 1:
"12345678 81234567 78"
call 2:
"123456 67812345 5678"
call 3:
" 1234 45678123 3456 "
call 4:
"7812 23456781"
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,当78
在第一次调用中读取时,它应该在下一帧之前处理,以便它决定78
帧之间是整数还是一帧.
现在我发现seq_file
s显然只是在内核想要将数据写入用户而不是读取时(或者可能是HOWTO写得非常糟糕).
到目前为止,我已经提出了以下解决方案(我是从记忆中写的,所以我可能会错过几次错误检查,但请耐心等待):
在初始化阶段(比如说init_module …
我的主要目的是在getchar
获得角色后立即返回,而不是等待ENTER密钥.我试过这个
int main()
{
setvbuf(stdin,NULL,_IONBF,0);
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将其与原型进行比较 setvbuf
setvbuf ( FILE * stream, char * buffer, int mode, size_t size );
Run Code Online (Sandbox Code Playgroud)
它应该设置stdin
为无缓冲模式.
但仍然getchar()
在等待ENTER
我见过这样的相关帖子
这表明制作stdin
无缓冲的替代方法.但我很想知道为什么setvbuf
方法不起作用
我已经使用硬件API很长一段时间了,几乎所有我工作过的API都有一个C接口.因此,在很多时候我使用裸new
s,不安全的缓冲和许多用C++代码包装的C函数.最后,C纯代码和C++纯代码之间的边界在我的脑海中搞砸了(我不知道澄清这个前沿是否有用).
现在,由于一些新的编码风格要求,我需要将所有怀疑不安全的代码重构为用C++编写的更安全的代码(假设C++代码更安全),最终目标是使用C++带来的工具.
所以,为了摆脱我的困惑,我正在寻求关于C/C++的几个主题的帮助.
memcpy
VS std::copy
AFAIK memcpy
是一个位于C库中的函数,因此它不是C++ ish; 另一方面std::copy
是STL中的一个函数,所以它是纯C++.
std::copy
则会调用std::memcpy
(进入cstring
标题).memcpy
调用重构为std::copy
调用将使代码更"纯C++"?为了处理新的代码样式要求,我决定继续使用memcpy
重构,有一些关于memcpy
和的问题std::copy
:
memcpy
类型不安全,因为它适用于原始void指针,可以管理任何类型的指针,无论它的类型如何,但同时非常灵活,std::copy
缺乏这种灵活性,确保类型安全.乍一看,memcpy
是使用序列化和反序列化例程的最佳选择(这是我确实使用的真实情况),例如,通过自定义串行端口库发送一些值:
void send(const std::string &value)
{
const std::string::size_type Size(value.size());
const std::string::size_type TotalSize(sizeof(Size) + value.size());
unsigned char *Buffer = new unsigned char[TotalSize];
unsigned char *Current = Buffer;
memcpy(Current, &Size, sizeof(Size));
Current += sizeof(Size);
memcpy(Current, value.c_str(), Size);
sendBuffer(Buffer, TotalSize);
delete []Buffer;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码运行正常,但看起来很糟糕; …
根据文档,BufferedReader(Reader)
使用默认缓冲区大小,而第二个构造函数BufferedReader(Reader, int)
允许设置缓冲区大小.
public BufferedReader(Reader in)
创建使用默认大小的输入缓冲区的缓冲字符输入流.
但是,文档并未提及默认缓冲区大小.
BufferedReader的默认缓冲区大小是多少?
如何在nodejs中创建base64 JSON编码的字符串?
我尝试过这个并没有用.
var buff = new Buffer({"hello":"world"}).toString("base64");
Run Code Online (Sandbox Code Playgroud)
是这个吗?
var buff = new Buffer(JSON.stringify({"hello":"world"})).toString("base64");
Run Code Online (Sandbox Code Playgroud)