今年最好能有 Koichi Sasada ...
#79 楼 @hooluupog 看情况的,这里的特定情况就是 C++ 没 GC/引用计数 没法做 COW 的字符串抽象
另外虚拟机的一个作用是使用抽象程度高的字节码达到节省内存的目的,有些 IC 卡上甚至能跑 Java, 但 C++ 运行时就载不进来。
Go 那个例子和优化没关系,Go 没有解释器所以只能在模板引擎里实现一个很原始的解释器,比现代解释器差很远的。Go 如果要改进这块性能,只能修改模板的处理方式,把模板文件编译成 Go 源文件再进行编译,否则永远也超不过 Ruby 的...
Go 一遍编译的速度已经没多少改进空间了,但理论上,虚拟机可以根据运行的 profile 动态修改代码,能达到比没有虚拟机的语言更快的速度 (虽然现在的虚拟机都没达到这样的效果).
#1 楼 @neverlandxy_naix prof 是找瓶颈用的,如果只想简单的看看平均一个请求要多久,用 ab 或者 siege 就可以吧...
sort 的复杂度是 nlog(n) , n 在 100 万以下 log(n) 当成 1 也可以... 就和遍历差不多。
reverse 直接就是线性的。不用纠结这种可有可无的速度了...
@zw963 ...你总是能深入挖掘...
#35 楼 @richard020389 我还有 bad apple 的屏保... 当年把 win7 扫雷版的原理搞出来了 (还是 1.9 的代码,现在都用 fiddle 不用 dl 了...)
# coding: utf-8
require "dl"
require "dl/import"
include DL
module MineSweeper
extend Importer
dlload 'user32.dll'
# ------------------------------------------------------------------------------
# memory for title match
MSstr = '扫雷'.encode(Encoding.default_external)
Mem = CPtr[MSstr + "\0"]
def Mem.zero
Mem.size.times do |i|
Mem[i] = 0
end
end
# ------------------------------------------------------------------------------
# find minesweeper window handle and assign to $ms_h
# window title text
# (handle, char*, sz)
extern 'int GetWindowText(int, int, int)', :stdcall
# to find minesweeper window
# (proc, lparam)
extern 'int EnumWindows(void*, int)', :stdcall
# (handle, lparam)
EnumCallback = bind "int enum_call_back(int, int)" do |h, _|
Mem.zero
GetWindowText h, Mem.to_i, Mem.size
txt = Mem.to_s.strip.force_encoding Encoding.default_external
if txt == MSstr
$ms_h = h
0
else
1 # 0 stops it
end
end
EnumWindows EnumCallback, 0
exit unless $ms_h
# ------------------------------------------------------------------------------
# activate minesweeper window
extern 'int SetForegroundWindow(int)', :stdcall
SetForegroundWindow $ms_h
# ------------------------------------------------------------------------------
# simulate right clicks
# move cursor
extern 'int SetCursorPos(int, int)', :stdcall
# generate a mouse event
# (event, x, y, _, _)
extern 'void mouse_event(int, int, int, int, int)', :stdcall
MOUSEEVENTF_RIGHTDOWN = 0x0008
MOUSEEVENTF_RIGHTUP = 0x0010
# for coordinate transformation
# (handle, point*)
extern 'int ClientToScreen(int, void*)', :stdcall
POINT = struct ['int x', 'int y']
module_function
# move mouse and right click
def click x, y
x = x*18 + 41
y = y*18 + 41
p = POINT.malloc
p.x = x
p.y = y
ClientToScreen $ms_h, p
SetCursorPos p.x, p.y
sleep 0.01
mouse_event MOUSEEVENTF_RIGHTDOWN, x, y, 0, 0
mouse_event MOUSEEVENTF_RIGHTUP, x, y, 0, 0
sleep 0.05
end
# right click twice to remove the little flag
def unclick x, y
x = x*18 + 41
y = y*18 + 41
p = POINT.malloc
p.x = x
p.y = y
ClientToScreen $ms_h, p
SetCursorPos p.x, p.y
sleep 0.01
mouse_event MOUSEEVENTF_RIGHTDOWN, x, y, 0, 0
mouse_event MOUSEEVENTF_RIGHTUP, x, y, 0, 0
mouse_event MOUSEEVENTF_RIGHTDOWN, x, y, 0, 0
mouse_event MOUSEEVENTF_RIGHTUP, x, y, 0, 0
sleep 0.05
end
end
def slop show
if show
12.times do |i|
MineSweeper.click i, i
end
else
12.times do |i|
MineSweeper.unclick i, i
end
end
end
def hori show
if show
12.times do |i|
MineSweeper.click i, 0
end
else
12.times do |i|
MineSweeper.unclick i, 0
end
end
end
5.times {
slop true
slop false
sleep 2
hori true
hori false
}
initialize_http_header
放在 post_form
后面了自然收不到
response = Net::HTTP.post uri, data, {"USER-AGENT" => @agent}
@qichunren @zputee
带音乐和颜色的... 用了 Mac OS X 的 say
和命令行播放器 afplay
, linux 应该也有类似的自己改一下就好
Thread.new do
system "say -r 300 #{'swa ' * 15}"
end
require "tempfile"
path = Tempfile.open 'nyan.mp3' do |f|
F = f # just don't GC it
f << `curl -s http://cdn.nyanit.com/audio/nyanlooped.mp3`
f.path
end
Thread.new{loop{system "afplay #{path}"}}
dot = ->{
i = 0
j = 16
-> {
i += 1
if i % 100 == 0
i = 0
j += 1
end
if j > 231
j = 16
end
"\e[38;5;#{j}m█"
}
}[]
x = 0
y = 0
loop do
print ' ' * ((1 + Math.sin(x += 0.1)) * 15 + 10)
n = ((1 + Math.sin(y += 0.019)) * 10).ceil
puts(n.times.map{dot[]}.join)
sleep 0.01
end
... 调幅信号:
x = 0
y = 0
loop do
puts '-' * ((1 + Math.sin(x += 0.018)) * ((1 + Math.sin(y += 0.15))) * 20)
sleep 0.01
end
欢迎炮哥加入电子书党...
方法可以和 module 同名
module A;end
def A
puts '和 module A 没关系'
end
x = 0
loop do
puts '-' * ((1 + Math.sin(x += 0.1)) * 20)
sleep 0.01
end
哦,其实瓶颈在 doc[k].scan
上面啦,你可以先建立一个索引,从 key 可以快速查出词频,然后利用此索引查找就快了。
doc_key_count = doc.map do |d|
h = {}
keys.each{|key| h[key] = d.scan(key).count }
h
end
for rowindex in 0...keyscount
for colindex in (rowindex + 1)...keyscount
matrixnum = 0
doc_key_count.each do |d|
rownum = d[keys[rowindex]]
colnum = d[keys[colindex]]
matrixnum += (rownum > colnum) ? colnum : rownum
end
matrix[rowindex][colindex] = matrixnum
end
end
上面代码没测试... 意思明白就可以...
另外如果是数值矩阵,用 NMatrix 就已经足够快了
可能是内存重分配太多造成的,用 Array.new 10000
直接创建大小为 10000 的矩阵
另外不知到你的实际问题是什么,或者可以用稀疏矩阵的技巧
支持中文就会被苹果快用免费化,会被腾讯山寨,还会有很多僵尸跑来打一分...
不能写 @include .center
的
@include
后面带的是 module 名称,@extend
后面带的是 css 选择器
程序不会变大了很多吧?我记得 acrobat 的亚洲语言库一百多兆...
这个人写的中文博客太水... 还是他用英文写的东西比较有内容...
花在系统函数调用上的时间
操作系统提供了很多函数,有处理 io 的,查询设置时间的,还有很多杂七杂八的。没这些函数应用程序没办法使用硬件。例如 printf
就是调用了输出到 stdout 的系统函数,web 服务器收发数据就是调用了 socket 相关的系统函数。
github 代练 star, 代刷关注的时代已经不远
@bhuztez @blacktulip 其实我一直觉得 duck typing 的表述应该改改:
If it walks like a duck, quacks like a duck, then we can cook it as a duck...
如果 /\p{P}/
不匹配 “”‘’
, 那就是因为你在用的 Ruby 太古老了
如果不能写 unicode 字符,那也是因为你在用的 Ruby 太古老了
赶紧升级吧... ruby 1.9 或者 ruby 2.0 都可以。1.8 很难匹配非 ascii 字符
如果仅仅是匹配中英标点但不匹配 '
和 ’
方法 1: 运用正则技巧之 double negation:
/[^'’[^\p{P}]]/
方法 2: 如果方法 1 不管用,是因为正则引擎比较老,但还可以运用正则技巧之 negative lookahead 解决:
/(?!['’])\p{P}/
如果还要去掉除了 n't
的结构外的所有 '’
, 就要改改代码了
'‘I don’t know’, he said.'.gsub(/(n['’]t\b)|\p{P}/, '\1')
# => "I don’t know he said"
代码解释:
n't
, 捕获组 \1
就是 n't
, 保持原样n't
但匹配标点,捕获组 \1
就是空字符串,等于去掉了标点