灵感来自这个问题
我想知道INT 21h是一个概念.现在,我对内部有一些非常生疏的知识,但没有那么多细节.我记得在C64中你有定期中断和不可屏蔽中断,但我的知识在这里停止.你能告诉我一些线索吗?这是DOS相关策略吗?
我想学习低级编程的所有高级细节,所以我希望能够
我正在研究可以在消费者硬件上运行的专用I/O软件.从本质上讲,它归结为保存大量数据流以供以后处理.现在我正在寻找一个模型来估计x86上的性能因素.
以新款Macbook Pro为例:
高速Thunderbolt I/O(输入/输出)技术可在两个方向上提供惊人的每秒10千兆位的传输速度
1.25 GB/s听起来不错,但当天的大多数处理器都是时钟2 Ghz.只要每个网络通道只能分配一个核心,多个核心就没什么区别.
因此,即使软件充当微型操作系统并且仅限于网络/磁盘操作,流入存储的数据量也不能超过每秒[1]块.虽然这暗示了粗略的性能限制,但我觉得它远远不够.P / (2 * N)
在处理器频率和其他硬件细节方面,应该考虑哪些其他因素来估算I/O性能?为简单起见,假设存储在所有情况下都能立即执行.
[1] P - 处理器频率; N - 算法开销
language-agnostic io performance network-programming low-level
我遇到了非常简单但烦人的问题,并且无法在互联网上找到答案.希望你能指出我,我做错了什么.
我正在尝试从Git存储库中解码对象.根据ProGit,文件名及其内容在提交期间已被缩小.
我正在使用C#将SHA1指示的对象读入流中,对其进行充气并转换为字节数组.这是代码:
using System.IO.Compression;
static internal byte[] GetObjectBySha(string storagePath, string sha)
{
string filePath = Path.Combine(storagePath, "objects", sha.Substring(0, 2), sha.Substring(2, 38));
byte[] fileContent = null;
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
using (MemoryStream ms = new MemoryStream())
{
using (DeflateStream gs = new DeflateStream(fs, CompressionMode.Decompress))
{
gs.CopyTo(ms);
}
fileContent = ms.ToArray();
}
}
return fileContent;
}
Run Code Online (Sandbox Code Playgroud)
当gs.CopyTo(ms);达到出现运行时错误:块长度不匹配它的补充.
为什么这样?
关于我正在尝试阅读的文件的内容......它是二进制的,它是由git可执行文件创建的.原始文件名是testfile.txt,它的内容是Sample text.SHA1 51d0be227ecdc0039698122a1513421ce35c1dbe.
任何想法将不胜感激!
尽管有关于这个问题的所有已知博客我总是怀疑一些结果,我的个人测试表明,良好的标准并不是最好的.
在循环内声明变量,使它们接近其范围,并使方法更快到达,但分配更多内存或在for scope范围外声明以节省内存分配,但增加处理以在远程实例中迭代.
我的结果显示方法B更快(有时),我想知道这个背景.
结果各不相同,我不是一个有点brusher的大师.
那你们怎么想呢?
方法A.
var object:Object = new Object();
var loop:int = 100000
for (var i:int = 0; i < loop; i++)
{
object = new Object();
object.foo = foo;
object.bar = bar;
}
Run Code Online (Sandbox Code Playgroud)
要么
方法B.
var loop:int = 100000
for (var i:int = 0; i < loop; i++)
{
var object:Object = new Object()
object.foo = foo;
object.bar = bar;
}
Run Code Online (Sandbox Code Playgroud) 为了这个问题,我将内存描述为一个简单的字节数组,我将讨论堆内存,因为它可以动态分配它.
让我们说我正在实例化一些类,并在堆上创建一个已经分配了一些内存的对象.然后,在创建对象之后,我分配了更多的内存(可能通过实例化另一个类).当然,这意味着使用new和delete关键字.
内存现在看起来像这样:
... byte byte my_object ... my_object byte byte ...
delete my_object;执行时到底发生了什么?是否所有其他记忆都向左移动sizeof(MyClass)?如果是这样,由谁?操作系统?那么当没有操作系统提供虚拟内存时会发生什么?
请考虑以下代码段
double id = ?;
double res;
long unsigned *res_u = (long unsigned*)&res;
long unsigned i;
for (i = 0; i < (long unsigned)-1; i++){
double *d1 = (double*)&i;
res = id + *d1;
assert(*res_u == i);
}
Run Code Online (Sandbox Code Playgroud)
我的问题:是否有价值id,所以断言适用于所有人i?换句话说,对于我们中间的数学家来说,是否有两倍是加法的中性元素?
有没有办法获得固定大小的缓冲区的长度?
就像是:
public struct MyStruct
{
public unsafe fixed byte buffer[100];
public int foo()
{
return sizeof(buffer); // Compile error.
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法完成这样的事情?
知道为什么'stackalloc'关键字接受可变长度?
如果该指令返回指向堆栈帧中分配的缓冲区的指针,编译器如何管理它?每次调用它来组织堆栈帧时,它都会在运行时重新编译该函数?
谢谢.