我发现像函数调用和循环这样的简单事情,甚至只是递增计数器的循环在Python和Ruby中花费的时间远远多于Chicken Scheme,Racket或SBCL.
为什么会这样?我经常听到有人说慢速是你为动态语言付出的代价,但是Lisps非常动态并且速度不是很慢(它们通常比C慢不到5倍; Ruby和Python可以达到两位数).此外,Lisp样式使用递归,并不总是尾递归,很多,堆栈是堆中的连续的链接列表等,这似乎应该使Lisp比命令式样式的Python和Ruby慢.
Racket和SBCL是JITted,但Chicken Scheme要么是静态编译的,要么使用非优化的解释器,这两种解释器都应该非常适合动态语言并且速度慢.即使使用了csiChicken Scheme 的天真解释器(甚至不进行字节码编译!),我的速度远远超出了Python和Ruby.
与类似的动态Lisps相比,为什么Python和Ruby的速度如此之慢?是因为它们是面向对象的,需要巨大的vtable和类型heirarchies?
示例:阶乘函数.蟒蛇:
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
for x in xrange(10000000):
i = factorial(10)
Run Code Online (Sandbox Code Playgroud)
球拍:
#lang racket
(define (factorial n)
(cond
[(zero? n) 1]
[else (* n (factorial (sub1 n)))]))
(define q 0)
(for ([i 10000000])
(set! q (factorial 10)))
Run Code Online (Sandbox Code Playgroud)
时间结果:
ithisa@miyasa /scratch> time racket factorial.rkt
racket factorial.rkt 1.00s user 0.03s system 99% cpu 1.032 total
ithisa@miyasa /scratch> time python factorial.py
python …Run Code Online (Sandbox Code Playgroud) 我的Racket GUI应用程序在退出时需要做很多清理工作,即当用户按下X按钮时.这些包括杀死子进程(在Windows上不是自动进程)等.
将.rkt包装在shell脚本中等待然后进行清理对我来说有点过于讨厌.Racket文档中有许多退出处理程序(退出处理程序等),但它们似乎都不起作用!
Racket具有很好的read-bytes-async!功能,我认为它存在于世界上所有其他编程语言中.它可以将输入流中的内容(无阻塞)读入缓冲区,返回写入的字节数.
所述函数似乎是有效实现Unix cat工具的绝对必要功能,但Chicken Scheme似乎缺乏任何此类功能.当然,我可以使用(read-byte)和(write-byte),但这很慢并且占用了我所有的CPU.
甚至(copy-port)似乎没有任何这样的实施.相反,在关闭流之前,仅在缓冲区填充时才逐个缓冲地复制数据.这意味着它(copy-port (current-input-port) (current-output-port))根本不像cat.
我只是在阅读文档时遇到了一个可怕的盲点,或者鸡真的缺乏这样的功能吗?所以cat甚至不能有效地写在鸡肉?
我正在尝试在Linux 32位上使用LiteIDE(Go IDE).一切都有效,除了自动完成.构建,运行,一切正常.该gocode二进制似乎运行寿:
ithisa@miyasa ~> ps aux | grep gocode
ithisa 10003 0.0 0.0 823788 2624 pts/1 Sl+ 09:06 0:00 /home/ithisa/scratch/liteide/bin/gocode -s -sock unix -addr localhost:37373
Run Code Online (Sandbox Code Playgroud)
我可能做错了什么?
我的一个软件需要在Windows上更改系统代理.更改路由器后面的LAN连接的HTTP代理很容易,但我找不到有关如何更改拨号代理或直接DSL(即PPPoE)连接的任何信息.
这很糟糕,因为我的很大一部分客户都在中国.在中国,很多人没有多台电脑,因而发现路由器浪费.他们只需将ADSL调制解调器连接到以太网端口并使用PPPoE.是的,这对于安全性和一切都很糟糕(僵尸网络在中国如此自由地漫游的一个原因)但这是现实,我的软件需要工作.
我还需要能够提供所有网络连接列表的代码.只要有代码在我相关的问题,需要一个知道的编辑会连接不工作.
我也喜欢使用reg 命令工作的东西.使用Windows API的简单C++或C#代码也很有用,但请注意我使用的是Racket,这是一种相当麻烦的FFI语言,这意味着最好尽量减少使用Windows C API.
用例:客户端需要通过HTTP发送大量字符串.服务器回复该字符串是否包含某些子字符串.然而,巨大的字符串是巨大的.因此,该系统效率非常低.而且,巨大的字符串包含一些敏感信息,所以这真的是不安全的.
是否有一些伪哈希机制以某种方式将一个大字符串汇总成一个数字,这个大字符串的所有子字符串都会哈希到相同的数字,但非子字符串很可能不会哈希到这个大字符串?
我目前正在编写一个需要更改Windows代理设置的C#代理程序.每个在线指南仅更改LAN连接的代理设置(即NAT后面).这是一个问题,因为中国的许多用户(我的目标受众)直接将PPPoE连接从他们的调制解调器连接到他们的计算机并使用PPPoE软件拨号到DSL(是的,这是非常安全的,所有监听端口都可以看到世界,但事情就是这样).
我该如何更改DSL代理?这很令人担忧,因为查看我的用户统计信息~20%的人没有自动更改代理设置.