免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhangzhh05
打印 上一主题 下一主题

[算法] 对Google算法优越性的一点小体会 [复制链接]

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
251 [报告]
发表于 2008-06-27 11:29 |只看该作者
继续啊

论坛徽章:
0
252 [报告]
发表于 2008-06-27 11:31 |只看该作者
原帖由 wwwsq 于 2008-6-27 11:27 发表



界面上提示是否可用的时候,都不一定需要去检查黑名单(这取决于用户想不想让这个提示严格的100%正确)。

对, 这就是我前面提出的问题, 检测用户是否重复, 定义到底是"不与几天以前的用户重复",还是"不与目前系统内的所有用户重复"? 如果你是客户, 你会接受哪一个, 如果你是邮件用户, 服务器告诉我可用了,输入了一大堆信息,但最后因为与几天内的客户重复了,最后被告诉重新输入, 你恼不恼火?

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
253 [报告]
发表于 2008-06-27 11:33 |只看该作者
tips重新显示:    bloom filter只是不允许删除,并不是不能插入新信息。

论坛徽章:
0
254 [报告]
发表于 2008-06-27 11:40 |只看该作者
原帖由 zszyj 于 2008-6-27 11:25 发表

别忘了,不实时刷新过滤器, 并发读的话, 是不用加锁的. 要实时刷新过滤器, 大量的并发读写, 是要加锁的, 如果真达到10000读+10000写, 加锁控制的代价, 并不是你们想的这么简单.
再者, 确实会存在你说的, 数据 ...

补充一点提示:
是否适合实时刷新过滤器. 需要弄清楚并发加锁读写与不加锁并发读的差异, 大家可以在自已的机器上, 分别以并发100个线程的方式, 循环去读一个全局的char[128]的字符串和一个同样内容的std::string字符串. 不用多,100个就已经看出效果了.因为std::string的实现,读取时是要缺省上锁的.
某些人号称"精通多线程"实现的, 也看看是否代价轻微.

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
255 [报告]
发表于 2008-06-27 11:59 |只看该作者
又见车轱辘:

原帖由 shan_ghost 于 2008-6-27 11:27 发表
tips: 磁盘寻道不需要时间。
tips: 数据库支持ACID不需要使用任何锁。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
256 [报告]
发表于 2008-06-27 12:00 |只看该作者
一个人犯错很正常;但每个帖子都犯错,就难能可贵了。
    ——毛泽东

数据库可以锁,为什么hash就不能锁。
   ——阿Q

[ 本帖最后由 shan_ghost 于 2008-6-27 12:02 编辑 ]

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
257 [报告]
发表于 2008-06-27 12:09 |只看该作者
C++是一种糟糕的(horrible)语言。而且因为有大量不够标准的程序员在使用而使情况更糟,以至于极容易产生彻头彻尾的垃圾(total and utter crap)。老实说,选择C就是为了把C++程序员踢出去。……我有这样的结论,任何喜欢用C++而不是C开发项目的程序员可能都是我希望踢出去的人,免得他们来搞乱我参与的项目。C++会导致非常非常糟糕的设计选择。你们这些C++程序员总是一上来就用语言的那些‘漂亮的’库特性比如STL、Boost和其他彻头彻尾的垃圾,这可能对你们的程序有所‘帮助’,但是却会导致:

“——当库无法工作时无穷无尽的折磨(别跟我说什么STL尤其是Boost很稳定而且可移植性很好,那全是屁话,而且一点都不可笑)

"——低效的抽象编程模型,可能在两年之后你会注意到有些抽象效果不怎么样,但是所有代码已经依赖于围绕它设计的‘漂亮’对象模型了,如果不重写应用程序,就无法改正。


”也就是说,使用优秀的、高效的、系统级的和可移植的C++的唯一方式,最终还是限于使用C本身具有的所有特性。项目限制只用C,意味着参与的人不会捣乱,也意味着会得到许多真正懂得底层问题,而不会折腾那些白痴‘对象模型’垃圾的程序员。

"所以,我很抱歉,但是对于Git这样效率是主要目标的软件,C++的所谓优点只是巨大的错误。而我们将看不到这一点的人排除在外却成了一个巨大的附加优势。

"如果你想要用C++写的版本控制系统,去玩Monotone吧。他们确实使用了‘真格的数据库’,使用了‘漂亮的面向对象库’、使用了‘漂亮的C++抽象’。可是说老实话,所有这些对某些计算机专业人士而言富于吸引力的设计决定,其最终结果确是一堆可怕、难以维护的垃圾。“


唯一真正重要的部分是设计。

"你当然可以用任何语言编写糟糕的代码。但是,有些语言,尤其是带有一些心理(mental)包袱的语言本身就非常糟糕。你这样的新手跑来指出一些绝对无关紧要的补丁特性,用它们作为一种语言优越的论据(这些东西语言原作者都不喜欢),这一事实本身恰恰说明你满脑子都是糊涂概念,应该好好醒悟一下了。

不仅指语言本身,还包括一种必需的心态(mentality)。C最大的优点之一,就是它不会使你认为程序是什么高层的东西。正是后一种心态会使你明显偏向其他语言,但实际上从Git的角度看来,所谓 ' 高层 ' 恰恰是错误的。"


                  ——Linus Torvalds

论坛徽章:
0
258 [报告]
发表于 2008-06-27 12:29 |只看该作者
原帖由 zszyj 于 2008-6-27 11:40 发表

补充一点提示:
是否适合实时刷新过滤器. 需要弄清楚并发加锁读写与不加锁并发读的差异, 大家可以在自已的机器上, 分别以并发100个线程的方式, 循环去读一个全局的char[128]的字符串和一个同样内容的std::str ...

再补充一点测试数据,多线程执行以下两个程序:
tt: 不加锁版本

#include <omnithread.h>

char str[128]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaa";

void* run(void* data)
{
    int i;
    char s[128];
    for (i=0; i<100000; i++)
    {
        strcpy(s, str);
    }

    int *rv=new int;
    *rv=0;
    return (void *)rv;
}

tt1: 加锁版本

#include <omnithread.h>

char str[128]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaa";

omni_mutex mutex;

void* run1(void* data)
{
    int i;
    char s[128];
    for (i=0; i<100000; i++)
    {
        mutex.lock();
        strcpy(s, str);
        mutex.unlock();
    }

    int *rv=new int;
    *rv=0;
    return (void *)rv;
}

运行结果:
--------------------------------
并发100用户:
$ time tt 100

real    0m1.837s
user    0m1.770s
sys     0m0.040s

$time tt1 100

real    0m3.058s
user    0m2.990s
sys     0m0.070s

--------------------------------
并发200用户:
$time tt 200

real    0m3.551s
user    0m3.400s
sys     0m0.130s
$time tt1 200

real    0m6.034s
user    0m5.900s
sys     0m0.120s
--------------------------------
并发500用户:
$time tt 500
Aborted (core dumped)

$time tt1 500
Aborted (core dumped)

并发200以下已经差距明显, 并发500根本过不去, 不知道并发10000读+10000写是个什么盛况? 想起来就向往.
并发访问控制, 真是件简单的事情吗?

论坛徽章:
0
259 [报告]
发表于 2008-06-27 12:39 |只看该作者
原帖由 zszyj 于 2008-6-27 12:29 发表

再补充一点测试数据,多线程执行以下两个程序:
tt: 不加锁版本

#include

char str[128]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaa";

void* run(vo ...

期待那些坚持对bloom filter实时刷新, 并实现bloom filter 10000并发读+10000并发写的"史上最强的超级程序员", 拿出漂亮的代码让我们开开眼界吧. 别总是嘴上无敌了.
再瞧不起数据库的锁机制, 再偏离目标去攻击C++, 也不不显得就是高手. 高手是证明出来的, 不是骂街出来的.

[ 本帖最后由 zszyj 于 2008-6-27 12:41 编辑 ]

论坛徽章:
0
260 [报告]
发表于 2008-06-27 12:43 |只看该作者
长学问
看到这里,发现大家争辩得有点顾此失彼

我插不上话,全当学习了

帖子很精彩,也很有激情
请继续
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP