小编ant*_*oyo的帖子

为什么FireFox插件中的JavaScript比FireFox中加载的网页慢?

我想知道为什么相同的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秒)?

javascript performance firefox firefox-addon

6
推荐指数
1
解决办法
522
查看次数

有没有一种干净的方法可以在 Rust 插件中拥有全局可变状态?

我发现这样做的唯一方法是使用不安全的单例函数:

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属性中的名称和字段,以便过程宏可以检查所有标识符是否存在。

rust

6
推荐指数
1
解决办法
1740
查看次数

将 Cargo 与自定义链接器一起使用

我想用来cargo构建需要自定义编译的项目(调用汇编器、链接器、\xe2\x80\xa6)。

\n\n

我可以使用构建脚本来做到这一点,但它并不完美。例如,为了构建本教程中的代码,我制作了以下构建脚本:

\n\n
use 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)

rust rust-cargo

6
推荐指数
1
解决办法
1万
查看次数

Rust是否使用基于区域的内存管理?

例如,如果我们忘记了返回值优化,并且具有以下代码:

fn func() -> Box<String> {
    Box::new(String::new())
}

fn main() {
    let boxed_string = func();
}
Run Code Online (Sandbox Code Playgroud)

编译器是否会创建区域来管理内存,还是会使用正常的堆分配?

我知道这个简单的代码可能会被优化,但在更复杂的代码中,可能并非如此.

region rust

6
推荐指数
1
解决办法
1415
查看次数

在一个 QPlainTextEdit 中使用多个 QSyntaxHighlighter

我写了两种语法高亮:一种用于 CSS,一种用于 HTML。他们工作得很好。

但是,我想在 HTML 代码中为 CSS 代码着色(在 <style> 标签内),所以我希望能够在一个 QPlainTextEdit 中使用多个 QSyntaxHighlighter。

有没有办法做我想做的事?我无法在同一个 QPlainTextEdit 上实例化两个 QSyntaxHighlighter 对象,因为只会使用第二个对象。

谢谢。

qt syntax-highlighting

5
推荐指数
1
解决办法
1143
查看次数

在 Firefox 的 HTML 画布中绘制调整大小的 SVG 图像

我想将调整大小的 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)

firefox svg canvas

5
推荐指数
1
解决办法
3373
查看次数

Cabal 和 HPC 以及运行代码覆盖率测试时的错误

我使用 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 文件)?

谢谢。

haskell cabal

5
推荐指数
1
解决办法
758
查看次数

什么时候 RwLock 会恐慌而不是死锁?

我注意到有时 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 什么时候会恐慌而不是陷入僵局?为什么?

deadlock rust

5
推荐指数
1
解决办法
946
查看次数

PostgreSQL 相当于 SQLite ROWID

使用 Postgresql 10 中新的 IDENTITY 类型,我想知道是否有类似于ROWIDSQLite 中的伪列来获取主键。

我想做类似的事情:

SELECT ROWID FROM Table
Run Code Online (Sandbox Code Playgroud)

在 Postgresql 中并获取主键。

编辑:这不是这个问题的重复,因为ROWID在 Oracle 中不给你主键。

sqlite postgresql

5
推荐指数
0
解决办法
2081
查看次数

为什么我不能直接将字节移动到64位寄存器?

为什么我不能直接将一个字节从内存移动到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)

assembly x86-64

4
推荐指数
1
解决办法
4335
查看次数