`
qiezi
  • 浏览: 492073 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
文章列表
Io Language是一种Prototype-Based Language,像JavaScript一样(其它类似的语言我不清楚),这也是个常见的词,JavaScript也非常流行,所以不用再详细解释这个概念了,主要说一下它的库扩展能力,玩过JavaScript/Ruby的对这个特性应该是很喜欢了。 举个小例子说一下这种模型的好处。 Io Language的Object有一个wait方法,它的实现就是个死循环,在没有其它任务的情况下会不断地取时间判断有没有超时。它的附加库里面有个Socket,是使用libevent来实现的,由于libevent使用的是基于事件接口,比如select/poll ...
有点厌倦了ErLang。 这种语言有很多优点,但缺点也是致命的。和C库的交互能力不是很好,主要原因是C库都是基于线程、阻塞线程的。Port不能很好地解决需要多线程来操作的资源,所以ErlyDB宁愿自己实现协议。 相比之下优点不是很突出了。分布式?一直在做分布式系统,积累的库再借鉴点Erlang的优点,已经解决大部分问题了。并发?状态机也不是很难写,就是有点恶心,当然C++有更高的效率,恶心点也值了。鲁棒性?编写服务器程序也有些经验了,虽然自己觉得写得也不怎么样,但稳定性方面不是问题。平滑升级?从架构上消除单点,再做到协议兼容,这方面也不是问题,即便是Erlang写程序也要考虑这两点。无锁什么 ...
DMD最近的版本号加入了闭包,感觉非常有用,虽然有些背后动作,不过我是实用派不介意这个。玩的时候忽然想到为什么没有lambda呢?AST还没影,不过可以利用D强大的模板可以使用字符串来先模拟一下。 我假想的语法是这样的: int[] arr = [1,2,3]; int[] arr1 = arr.map(lambda!("int x -> x * x")); 上面执行的arr1结果将会是[1,4,9]。 在编写过程中发现匿名委托不能够使用模板来这样生成: template labmda(string expr) { auto lambda ...
琢磨了好久,一直没时间来做它。在讨论这个问题的时候就已经有这想法了,后来发现tango里已经有Fiber的实现,昨天终于抽了点时间做了个简单的小玩意,离真实应用还差得很远。 测试代码: import light_process; import tango.io.Stdout; void test() { Stdout("test").newline; receive( (Process pid, float f) { Stdout("test: receive float: ", f).newline; pid. ...
内存管理通常指的是堆上分配的空间,栈上分配虽然高效好用,但一般是固定大小的、不能持久保存的。堆上分配就有了释放的问题,代码中有一些是使用new/malloc来分配空间的,还有一些是使用内存池,如何在释放时区分是必须 ...
考虑到现有的项目使用erlang重写的复杂性和erlang对于某些数据库支持的弱点,想结合erlang的分布式、代码热加载、处理高并发方面的优势,和C++在性能上以及大量现有项目上的优势,实现集群部署。 考察了erlang和C进行交互的几种方式,ports受限于物理服务器分布,port_driver没测试成功,应该也是受限于本机,最后选定C nodes方式。 测试了c server和c client两种方式,感觉如果是server方式,还得用C写一套处理高并发的网络模块,也不方便升级,erlang的优势完全没发挥上,所以选定client方式。 大致的想法是这样的: * erlang监听一个 ...
搜到这篇: erlang网络编程的几个性能调优和注意点 早看到这个就好了,我也是用strace发现它用的是poll,顺便搞清楚了erlang的分布式节点通讯方式。 erlang分布式节点通讯,A节点连接B节点,如果在同一机器上,只需要进程间通讯就可以找到节点。不在同一台机器上,A先连接B所在机器的4369端口,寻找节点。如果找到,就通知B节点监听一个端口,再回复A让它连接这个端口。 监听4369端口的是个后台进程epmd,在linux上它使用select,它只建短连接。windows上是epmd.exe。在linux上,节点的监听端口使用poll,指定+K true参数以后,会使用epo ...
phobos里面在stc.c.stdlib里提供了qsort,这是个传统的qsort: void qsort(void *base, size_t nelems, size_t elemsize, int (*compare)(void *elem1, void *elem2)); 它接受的比较函数是个函数指针,如果我们想使用委托就比较麻烦了,委托是对象指针和函数指针的绑定。 phobos/internal/qsort2.d里实现了一个数组排序方法: extern (C) long _adSort(Array a, TypeInfo ti) { synchroniz ...
前段时间做了个简单的dtwisted项目,只有个雏形,高层点的东西就没有了。 以前用ACE做过小型游戏服务器、视频转发服务器,比较熟悉点的是reactor模式。其间也尝试过proactor,一知半解不得要领,于是放弃了。 今天工作闲暇尝 ...

强类型数值计算

    博客分类:
  • D
以前曾经讨论过使用typedef来完成强类型的数值计算,最终遇到的问题是D里面没办法定义进行全局运算符重载。 最近在struct上找到点灵感,把基本类型用struct包装后使用,就可以重载运算符了,当然效率也是有保证的,D前几个版本已经完成了NRVO,struct也可以在栈上分配,所以不用担心性能,不过编译时注意打开-O选项。 简单测试了一下,性能与基本类型基本上没有差别: template WrapStruct(T) { T value; T opCast() { return value; } typeof(*this) opAssign(T)(T ...
做了个简单的单元测试框架,只算个毛坯,遇到一些问题。 1、由于没有完整的堆栈跟踪,所以无法打印出断言失败的行号。 2、无法获得行号,成功、失败或异常都需要显示这个。 3、由于unittest关键字后面的块是一个函数,所以把这个单元测试放在里面时,成了内嵌类,这时D禁止调用static ctor。当然这不算是个大问题。 只做了简单输出,没什么实际用途。代码如下: class TestCase { public template TestCases(Methods ...) { static this() { typeof(this) instance = ...
文档从MSDN抄过来的,稍稍改了一下。 module array; struct random_access_iterator(T) { private: alias random_access_iterator!(T) self_type; T[] array; size_t pos; public: static self_type opCall(T[] array, size_t pos) { self_type ret; ret.array = array; ret.pos = pos; return ret; } ...
写了一个编译期执行的fibonacci模板: template fibonacci(long n){ static if(n <= 2) const long fibonacci = 1; else const long fibonacci = fibonacci!(n-1) + fibonacci!(n-2); } static long a = fibonacci!(40); D语言新支持的编译期执行函数也可以完成: long fibonacci(long n){ if (n <= 2) ...
借助D语言新的mixin表达式,可以完成一些代码生成功能,比如: template attr_accessor(T, char[] name){ mixin(" private T _" ~ name ~ "; public " ~ name ~ "(){ return _" ~ name ~ "; } public " ~ name ~ "(T v){ _" ...
跑去听了苹果Leopard技术研讨会,主要是讲Leopard的新特性,终于知道了在Mac上编写程序是多么有趣和轻松,做出来的东西看起来也很专业。听得多忘得也多,瞎写点。 感觉Apple是把自己使用的反响比较好的东西都开放出来了,所 ...
Global site tag (gtag.js) - Google Analytics