3

我正在寻找性能最好的代码,它会从二进制文件中删除所有黑色像素 = #{000000}。代码示例:

img: make image! [100x75 0.0.255]
loop 1000 [change at img random 99x74 0.0.0]
probe length? foo: copy img/rgb
probe delta-time [remove-each [r g b] foo [ all [zero? r zero? g zero? b] ]]
probe length? foo
foo: copy img/rgb
probe delta-time [trim/with foo #{000000}]
probe length? probe foo

Trim 的执行速度非常快,但不能按预期工作,因为它会从二进制文件中删除所有零字节 #{00}。

从二进制文件中删除所有“黑色像素”=三个零字节=#{000000}的最快代码是什么?有什么进一步的建议吗?可能使用 parse 性能更好?

4

2 回答 2

4

使用 PARSE 并创建一个新的二进制系列应该是最快的方法:

probe length? foo: copy img/rgb
new: make binary! length? foo

probe delta-time [
    parse foo [any [s: #{000000} | 3 skip (append/part new s 3)]]
]
probe length? new

在这里,它的执行速度几乎比使用 REMOVE-EACH 快两倍。

于 2013-11-06T12:33:14.903 回答
2

比删除每个示例快四倍:-)

print "=========="
probe length? foo: copy img/rgb
new: make binary! length? foo
probe delta-time [
    parse foo [
        here:
        there: 
        any [
            #{000000} (append/part new here there ) here: there: 
            | 3 skip there: 
        ]
        (append/part new here there  )    
    ]
]
probe length? new

结果

; remove-each
==========
0:00:00.003395
19683

; parse with concatenated append
==========
0:00:00.000872
19683
于 2013-11-06T14:39:56.077 回答