Wiky

Wiky 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

Linux Inside

个人动态

Wiky 提出了问题 · 2015-12-07

解决百度地图的坐标系影响距离计算吗

最近在做一些LSB的功能,其中最典型的就是从数据库中筛选出某个点为中心1000米范围内的数据。

数据库用的是PostgreSQL+PostGIS。打算用百度地图获取经纬度。

但不知道百度地图自己的坐标系系统是否影响计算距离。

关注 4 回答 1

Wiky 提出了问题 · 2015-07-14

Android开发哪些地方可能需要用到NDK

有什么地方是Java实现不了,或者实现不好,一定要用NDK的吗。

关注 5 回答 4

Wiky 回答了问题 · 2015-02-25

解决inline 什么意思

inline就和它字面意思一样,“将代码插入进去“。

加了inline的函数,我们期望编译器直接将代码插入到调用的地方,比如下面代码

static inline void hello_world(void)
{
    printf("hello world\n");
}

int main()
{
    hello_world();
    hello_world();
}

那么编译器会把这段代码看成

int main()
{
    printf("hello world\n");
    printf("hello world\n");
}

就和宏展开一样。因此省去了函数调用,加快了一点点运行速度。同时代码中有了两个printf("hello world\n"),增加了一点重复的代码,也就是所谓的 使用inline会增加二进制映像的大小。

但是inline不是绝对会有效果的,它更像一种建议,编译器会智能地处理inline,在可以展开的时候才会展开。

有几种情况下使用inline没有效果,其实都和inline本身展开的特点相关。

1.函数地址被引用
    typedef void (*hello)(void);
    int main()
    {
        hello f=hello_world;
        f();
    }
  这种情况下,inline不会被展开,那么inline没有任何效果。

2. 函数是对外接口,考虑下面这种情况。
a.h
----
#ifndef __A_H__
#define __A_H__
inline void hello_world(void);
#endif

a.c
----
#include <stdio.h>
inline void hello_world(void)
{
    printf("hello world\n");
}

main.c
----
#include "a.h"
int main()
{
    hello_world();
}
在这个例子中,程序编译时,是先把a.c编译成a.o,main.c编译成main.o,然后将a.o和main.o链接起来。
可想而知,在这个过程中,main.c根本没法将hello_world()展开。
其实这个情况和情况一是类似的,在这里,hello_world的地址被引用了。只不过这个地址是在链接时候才确定的。

这也是为什么inline函数都是static的。

3. 没有开启优化的情况下gcc默认不展开inline函数,简单的说就是不优化的情况下,inline没有任何作用。

关注 5 回答 3

Wiky 回答了问题 · 2015-02-12

解决slice内存分配如何起作用?

在stackoverflow上找到答案,翻译过来,略加描述。

glibc的malloc以前确实是众所周知的慢,因此加入了GSlice。但自那之后glibc的malloc已经优化了很多。
GSlice以前确实比malloc快很多,但现在的malloc 因为已经优化过了,已经比以前快很多了,尤其在线程很多的应用程序中。 而gslice在加入之后就没有实质性地更改过。

据我所知,现在使用gslice的唯一原因就是它在不同平台上都相当稳定(良好的跨平台性)。 Windows上的malloc对于GStreamer来说实在太慢了。

所有的这些都表明,你所做的测试不是一个很好的测试。slab类型的内存分配器,如gslice通常是用来减少,因大量不同大小的内存分配、释放而造成的内存碎片。你所作的只是分配大量内存然后释放它(并没有测试内存碎片的情况)。类似gslice这样的分配器,在分配相同大小的内存时才有效。

关注 1 回答 1

Wiky 提出了问题 · 2015-02-09

解决slice内存分配如何起作用?

我写了个简单的例子来测试g_slice_alloc()g_malloc()的性能

代码

slice版本

#include <gtk/gtk.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    gchar *mem[1000000];
    gint i;
    for(i=0;i<1000000;i++){
        gint j=i>10000?10000:i;
        mem[i]=g_slice_alloc(j);
    }
    for(i=0;i<1000000;i++){
        gint j=i>10000?10000:i;
        g_slice_free1(j,mem[i]);
    }
    return 0;
}

malloc版本

#include <gtk/gtk.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    gchar *mem[1000000];
    gint i;
    for(i=0;i<1000000;i++){
        gint j=i>10000?10000:i;
        mem[i]=g_malloc(j);
    }
    for(i=0;i<1000000;i++){
        gint j=i>10000?10000:i;
        g_free(mem[i]);
    }
    return 0;
}

运行

然后分别运行这两个程序

$ time ./slice

real    0m1.531s
user    0m0.310s
sys     0m1.220s

$ time ./malloc

real    0m1.532s
user    0m0.276s
sys     0m1.252s

结果

结果显示两个程序的速度是非常接近的,多次运行后发现有时这个快点,有时那个快点,属于正常的浮动。基本上就是两者的运行速度是没什么差别的。

问题

如果是这样的话,那么slice存在的意义是什么?这个测试例子已经分配了非常大量的内存了,性能居然和malloc一样。

关注 1 回答 1

Wiky 赞了回答 · 2015-02-05

解决django中数据库链接是否是持久的

楼上的回答是django queryset是在何时去访问数据库
django 1.6新增了配置项CONN_MAX_AGE,默认值是0,在每次请求完之后都关闭对应的数据库连接。
设置成None则保持长连接。

参考官方文档

关注 3 回答 2

Wiky 提出了问题 · 2015-02-05

解决django中数据库链接是否是持久的

django中数据库的链接的被封装起来的,一般不需要直接操作。

但是我想知道django中数据库的链接是一个请求新开一个链接,

还是说可以保持链接,多次使用。

关注 3 回答 2

认证与成就

  • 获得 14 次点赞
  • 获得 21 枚徽章 获得 0 枚金徽章, 获得 9 枚银徽章, 获得 12 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2014-09-21
个人主页被 223 人浏览