我在C中编写了一个虚拟机作为业余爱好项目.此虚拟机执行的代码与Intel语法x86程序集非常相似.问题是这个虚拟机使用的寄存器只是名称中的寄存器.在我的VM代码中,寄存器与x86寄存器一样使用,但机器将它们存储在系统内存中.在VM代码中使用寄存器而非系统内存没有性能改进.(我认为只有地方才能提高性能,但在实践中,没有任何改变.)
在解释程序时,此虚拟机将指令的参数存储为指针.这允许虚拟指令获取内存地址,常量值,虚拟寄存器或几乎任何参数.
由于硬件寄存器没有地址,我想不出将VM寄存器实际存储在硬件寄存器中的方法.在我的虚拟寄存器类型上使用register关键字不起作用,因为我必须得到一个指向虚拟寄存器的指针才能将其用作参数.有没有办法让这些虚拟寄存器更像他们的原生对应物?
如果有必要的话,我很乐意钻研装配.我知道JIT编译这个VM代码可以让我使用硬件寄存器,但我希望能够将它们与我的解释代码一起使用.
我在C中编写了一个虚拟机,其中有一个调用表填充了指向函数的指针,这些函数提供了VM的操作码的功能.当虚拟机运行时,它首先解释一个程序,创建一个索引数组,该索引数组对应于所提供操作码的调用表中的相应函数.然后它循环遍历数组,调用每个函数直到它到达结尾.
每条指令都非常小,通常是一行.适合内联.问题是编译器不知道何时将调用任何虚拟机的指令,因为它是在运行时决定的,所以它不能内联它们.函数调用和参数传递的开销正在扼杀我的VM的性能.关于如何解决这个问题的任何想法?
我正在编写一个多线程的高度并行应用程序.我已经编写了一个SSE加速线程类.如果我要写一个MMX加速线程类,那么同时运行两个(一个SSE线程和每个核心一个MMX线程)性能会明显提高吗?
我认为这个设置有助于隐藏内存延迟,但我想在开始花时间之前确定它.
我现在正在尝试将整数转换为字符串,但遇到了问题。
我已经完成了大部分代码的编写和工作,但是在传送到下一个地方时它有一个小缺陷。这很难描述,所以我给你举个例子。使用 base 26 和由小写字母组成的字符集:
0 = "a"
1 = "b"
2 = "c"
...
25 = "z"
26 = "ba" (这应该等于 "aa")
在某些情况下似乎会跳过字符集中零位的字符。
令我困惑的是我的代码没有任何问题。我已经在这方面工作了太久了,但我仍然无法弄清楚。
char* charset = (char*)"abcdefghijklmnopqrstuvwxyz";
int charsetLength = strlen(charset);
unsigned long long num = 5678; // Some random number, it doesn't matter
std::string key
do
{
unsigned int remainder = (num % charsetLength);
num /= charsetLength;
key.insert(key.begin(), charset[remainder]);
} while(num);
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,该函数在返回零的模数上绊倒了,但我一直在研究这个,我无法弄清楚它是如何发生的。欢迎任何建议。
编辑:生成的字符串是小端的这一事实与我的应用程序无关。
我正在开发一个允许用户上传演示文稿的 Django 网络应用程序。演示文稿需要转换为图像,每张幻灯片一张,图像需要作为模型的一部分保存到 ImageField。但是,当我尝试将本地图像保存到模型时,Django 在图像文件的标题上抛出了 UnicodeDecodeError。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
我做了一些阅读,发现这是 PNG 图像文件的有效标头的一部分。似乎无论出于何种原因,Django 都试图将二进制文件解码为 unicode。
这是我试图将图像保存到的模型:
class PresentationSlide(models.Model):
...
image = models.ImageField(upload_to=upload_to)
Run Code Online (Sandbox Code Playgroud)
该upload_to函数使用 base64 编码的 UUID 保存上传的文件。
在一个视图中,我验证表单,获取演示文件,并使用自定义库将其转换为临时目录中的单个图像。然后的想法是为这些图像中的每一个创建一个 PresentationSlide 实例。
下面是我尝试创建模型实例和保存图像的方法。
presentation = Presentation.objects.create(
description=form.cleaned_data['description'])
slides = [PresentationSlide.objects.create(
presentation=presentation, order=order,
duration=form.cleaned_data['slide_interval'])
for order, image in enumerate(slide_images)]
for image_path, slide in zip(sorted(slide_images), slides):
with open(image_path) as image:
slide.image.save(image.name, File(image))
Run Code Online (Sandbox Code Playgroud)
是什么导致 Django 尝试将此二进制文件解码为 Unicode 文本?
我有一个函数,我写了从64位整数转换为基数62字符串.最初,我实现了这样:
char* charset = " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int charsetLength = strlen(charset);
std::string integerToKey(unsigned long long input)
{
unsigned long long num = input;
string key = "";
while(num)
{
key += charset[num % charsetLength];
num /= charsetLength;
}
return key;
}
Run Code Online (Sandbox Code Playgroud)
但是,这太慢了.
我通过提供生成查找表的选项来提高速度.该表大小约为62 个字符串,生成方式如下:
// Create the integer to key conversion lookup table
int lookupChars;
if(lookupDisabled)
lookupChars = 1;
else
largeLookup ? lookupChars = 4 : lookupChars = 2;
lookupSize = pow(charsetLength, lookupChars);
integerToKeyLookup = new char*[lookupSize];
for(unsigned long i …Run Code Online (Sandbox Code Playgroud) 现在,我有一个我正在研究的控制台应用程序,它应该以给定的间隔显示和更新信息到控制台.我遇到的问题是回车时,我一次只能更新一行文本.如果我使用换行符,则无法再使用回车更新旧行.
我能在这做什么?