pInvoke调用c函数与调用c#函数效率对比

对比一个简单的add操作,代码如下:

        static void perf()
        {
            const int N = 100000000;
            const int M = 123;
            {
                long start = Ezg.ezg_now();
                long ret = 0;
                for (int i = 0; i < N; i++)
                {
                    ret = Ezg.add(ret, i%M);//c函数
                    ret %= M;
                }
                Ezg.log((Ezg.ezg_now() - start) + "");
                Ezg.log("" + ret);
            }
            {
                long add(long a,long b)
                {
                    return a + b;
                }
                long start = Ezg.ezg_now();  
                long ret = 0;
                for (int i = 0; i < N; i++)
                {
                    ret = add(ret, i % M); //本地函数
                    ret %= M;
                }
                Ezg.log((Ezg.ezg_now() - start) + "");
                Ezg.log("" + ret);
            }
            {
                long add(long a, long b)
                {
                    return a + b;
                }
                long start = Ezg.ezg_now();
                long ret = 0;
                for (int i = 0; i < N; i++)
                {
                    ret += (i % M); //直接用+
                    ret %= M;
                }
                Ezg.log((Ezg.ezg_now() - start) + "");
                Ezg.log("" + ret);
            }
        }
继续阅读pInvoke调用c函数与调用c#函数效率对比

网络编程中的scatter/gather I/O(发散/聚合IO)

asio中支持scatter/gather I/O操作,于是就想知道它是否真正的节省了底层系统调用。直接搜asio相关实现的介绍,没找到。自己也没时间翻代码。于是猜应该是系统支持相关API,于是搜 socket scatter/gather I/O,马上就找到了维基百科,还有一篇csdn博客。

Vectored I/O
分散/聚集IO(scatter/gather)及iovec结构体

有API示例代码,示例中是linux代码,在windows平台也有类似API。

原来人家还叫“ Vectored I/O”
核心读写函数可以接受多个数组,由操作系统提供。这样在发送多个小数据包时,可以降低系统调用次数,或者减少数据拷贝次数。

降低boost智能指针开销

1.完全单线程

如果程序是单线程,或者多线程交互由上层调度(比如我这里,c程序是单线程,上层c#程序是多线程),这时可以在编译c库时加上”-DBOOST_SP_DISABLE_THREADS”,降低智能指针开销。

BOOST_SP_DISABLE_THREADS是boost智能指针库定义的一个宏,开启这个宏后,会把底层的atomic计数,换成普通的++。这样就变成了一个普通的计数,去除了不必要的开销。
新版本中是换成了“sp_counted_base_nt.hpp”,道理是一样的。

这样我们就可以用更低的开销,写同样安全的代码,而且不用打破编码习惯,像enable_shared_from_this等着用的写法,一样统统能用,一点不用变。

继续阅读降低boost智能指针开销

msvs2017中设置文件的默认格式

可以采用editorconfig,额可以指定编码、换行符缩进等。只要在根文件夹下放一个“.editorconfig”文件,下面所有的文件都生效。详情可以去官方网站看:点我

很多别的编辑器也支持这个配置,比如idea,vscode,所以换个编辑器,也是同样的配置,很方便。

PS:vs的高级保存设置 中,看不到文件真正的编码和EOL,可以换到vscode中验证,是否生效。我在msvs中新建文件保存中文,tab缩进,用vscode打开后都是生效的,中文也正常显示,没有乱码。推荐!!

在我的cmake工程中使用的配置如下,想偷懒的直接拿去。

# top-most EditorConfig file
root = true
[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 4