我想知道为什么相同的JavaScript代码在FireFox附加组件(使用附加SDK)中比在FireFox中加载的网页中直接运行要慢得多.
例如,这段代码:
function isPrime(number) {
var i,
prime = true;
for(i = 2 ; i < number ; ++i) {
if(number % i === 0) {
prime = false;
}
}
return prime;
}
function sumFirstPrimeNumbers(x) {
var i,
sum = 0;
for(i = 1 ; i <= x ; ++i) {
if(isPrime(i)) {
sum += i;
}
}
return sum;
}
var sum = sumFirstPrimeNumbers(15000);
console.log(sum);
Run Code Online (Sandbox Code Playgroud)
在FireFox中打开的网页中运行时间不到2秒,但在FireFox附加组件中运行大约需要15秒.
我知道代码可能会更好,但它只是一个示例来说明它有多慢.
为什么FireFox附加组件会变慢?
有没有办法让它更快(不改变这个代码,因为它,如上所述,只是一个例子)?
更新:
它似乎与Add-on SDK有关.我做了另一个测试:我在附加组件中执行相同的代码,该附加组件不使用附加组件SDK,代码在大约3秒内执行.
为什么使用附加SDK的附加组件和不使用它的附加组件之间存在如此巨大的差异(3秒vs 15秒)?
我发现这样做的唯一方法是使用不安全的单例函数:
fn singleton() -> &'static mut HashSet<String> {
static mut hash_map: *mut HashSet<String> = 0 as *mut HashSet<String>;
let map: HashSet<String> = HashSet::new();
unsafe {
if hash_map == 0 as *mut HashSet<String> {
hash_map = mem::transmute(Box::new(map));
}
&mut *hash_map
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?也许我们可以在plugin_registrar函数中做点什么?
通过全局可变状态,我的意思是一个可以被多个过程宏和/或属性使用的可变变量。
更新:
我正在编写一个编译器插件来提供sql!程序宏。我有一个#[sql_table]用于结构的属性,以便我可以获取 SQL 表的名称和列。
我需要全局可变状态来保存struct属性中的名称和字段,以便过程宏可以检查所有标识符是否存在。
我想用来cargo构建需要自定义编译的项目(调用汇编器、链接器、\xe2\x80\xa6)。
我可以使用构建脚本来做到这一点,但它并不完美。例如,为了构建本教程中的代码,我制作了以下构建脚本:
\n\nuse std::fs::create_dir;\nuse std::process::Command;\n\nfn main() {\n build();\n link();\n iso();\n}\n\nfn build() {\n Command::new("cargo")\n .current_dir("uefi_app")\n .args(&["rustc", "--", "--emit", "obj"])\n .status().unwrap();\n}\n\nfn iso() {\n let disk_file = "target/debug/disk.img";\n let disk_dir = "target/debug/disk";\n let efi_boot = disk_dir.to_owned() + "/efi/boot";\n let copy_dest = efi_boot.clone() + "/bootx64.efi";\n\n let dd_of = "of=".to_owned() + disk_file;\n Command::new("dd")\n .args(&["if=/dev/zero", &dd_of, "bs=512", "count=93750"])\n .status().unwrap();\n\n Command::new("parted")\n .args(&[disk_file, "-s", "-a", "minimal", "mklabel", "gpt"])\n .status().unwrap();\n\n Command::new("parted")\n .args(&[disk_file, "-s", "-a", "minimal", "mkpart", "EFI", "FAT16", "2048s", "93716s"])\n .status().unwrap();\n\n Command::new("parted")\n .args(&[disk_file, …Run Code Online (Sandbox Code Playgroud) 例如,如果我们忘记了返回值优化,并且具有以下代码:
fn func() -> Box<String> {
Box::new(String::new())
}
fn main() {
let boxed_string = func();
}
Run Code Online (Sandbox Code Playgroud)
编译器是否会创建区域来管理内存,还是会使用正常的堆分配?
我知道这个简单的代码可能会被优化,但在更复杂的代码中,可能并非如此.
我写了两种语法高亮:一种用于 CSS,一种用于 HTML。他们工作得很好。
但是,我想在 HTML 代码中为 CSS 代码着色(在 <style> 标签内),所以我希望能够在一个 QPlainTextEdit 中使用多个 QSyntaxHighlighter。
有没有办法做我想做的事?我无法在同一个 QPlainTextEdit 上实例化两个 QSyntaxHighlighter 对象,因为只会使用第二个对象。
谢谢。
我想将调整大小的 SVG 图像绘制到 HTML 画布上。
它在 Chromium 中运行良好,但在 Firefox 中不起作用。在 Firefox 中,图像是像素化的。
这是SVG图像:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="200" viewbox="0 0 200 200">
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>
</svg>
Run Code Online (Sandbox Code Playgroud)
这是代码:
<!DOCTYPE html>
<html>
<head>
<title>Resized SVG in Canvas</title>
<meta charset="utf-8"/>
<script>
window.addEventListener('load', function() {
var canvas = document.getElementById('canvas'),
context = canvas.getContext('2d'),
image = new Image();
image.src = 'circle1.svg';
image.height = 400;
image.width = 400;
image.addEventListener('load', function() {
try …Run Code Online (Sandbox Code Playgroud) 我使用 Cabal 来运行我的测试。
以下是它在文件中的配置方式.cabal:
test-suite test
type: exitcode-stdio-1.0
main-is: Test.hs
build-depends: base >= 4.7 && < 4.8, containers >=0.5 && <0.6, ghc, test-framework >=0.8 && <0.9, QuickCheck >=2.7 && <2.8, HUnit >=1.2 && <1.3, test-framework-hunit, test-framework-quickcheck2
default-language: Haskell2010
ghc-options: -Wall -fhpc
Run Code Online (Sandbox Code Playgroud)
当我第一次运行测试时,一切正常。
但是,如果我更改测试并再次运行它们,则会出现以下错误:
Hpc failure: module mismatch with .tix/.mix file hash number
(perhaps remove test.tix file?)
Run Code Online (Sandbox Code Playgroud)
所以,我需要手动删除该.tix文件。
有没有办法摆脱这个问题?
顺便问一下,有没有办法让这个.tix文件生成在dist目录中而不是根目录中?
如何配置我的 Cabal 文件以与 HPC 良好配合(即在dist目录中包含生成的 HTML 文件)?
谢谢。
我注意到有时 Rust 会恐慌以防止死锁。例如,这段代码会出现恐慌:
let rw_lock = RwLock::new(42);
{
let data0 = rw_lock.write().unwrap();
let data1 = rw_lock.read().unwrap();
let data2 = rw_lock.read().unwrap();
}
Run Code Online (Sandbox Code Playgroud)
但是,这不会(反而会导致死锁):
let rw_lock = RwLock::new(42);
{
let data1 = rw_lock.read().unwrap();
let data2 = rw_lock.read().unwrap();
let data3 = rw_lock.write().unwrap();
}
Run Code Online (Sandbox Code Playgroud)
Rust 什么时候会恐慌而不是陷入僵局?为什么?
使用 Postgresql 10 中新的 IDENTITY 类型,我想知道是否有类似于ROWIDSQLite 中的伪列来获取主键。
我想做类似的事情:
SELECT ROWID FROM Table
Run Code Online (Sandbox Code Playgroud)
在 Postgresql 中并获取主键。
编辑:这不是这个问题的重复,因为ROWID在 Oracle 中不给你主键。
为什么我不能直接将一个字节从内存移动到Intel x86-64汇编中的64位寄存器?
例如,这段代码:
extern printf
global main
segment .text
main:
enter 2, 0
mov byte [rbp - 1], 'A'
mov byte [rbp - 2], 'B'
mov r12, [rbp - 1]
mov r13, [rbp - 2]
xor rax, rax
mov rdi, Format
mov rsi, r12
mov rdx, r13
call printf
leave
ret
segment .data
Format: db "%d %d", 10, 0
Run Code Online (Sandbox Code Playgroud)
打印:
65 16706
Run Code Online (Sandbox Code Playgroud)
我需要将移动字节更改为寄存器r12和r13,以使代码正常工作:
xor rax, rax
mov al, byte [rbp - 1]
mov r12, rax
xor rax, rax
mov al, …Run Code Online (Sandbox Code Playgroud) rust ×4
firefox ×2
assembly ×1
cabal ×1
canvas ×1
deadlock ×1
haskell ×1
javascript ×1
performance ×1
postgresql ×1
qt ×1
region ×1
rust-cargo ×1
sqlite ×1
svg ×1
x86-64 ×1