C/C++/Perl/汇编/Java效率比较

这篇文章真的不错,转载于此,盖因这里支持直接Copy网页,省去了排版的麻烦,^_^

本文适合初学编程的程序员阅读,它对比了几种编程语言在解决同一问题的时候的运效率。并通过具体的例子进行了量化分析。主要目的是帮助初学者认识各种编程语言的特质,并且能够理性的选择适合的编程语言来进行工作。

事发

我无聊的翻着散落案头的书籍,这些都是五花八门的关于编程和系统管理的著作。干了这么多年程序员,大大小小的软件和项目也做了无数。每每有新入行的朋友问我这个所谓的”老前辈”:哪种语言最好之类的问题,我总会作出一副知识渊博的样子,复述着从更老的老前辈那里听来的或者某些名著上看来的”知识”。就好比我们从学习编程的第一天起,就被计算机老师告知,COBOL语言是擅长处理商务事务、FOTRAN语言是用于科学计算一样。类似的知识还有”汇编语言比C语言快得多”以及”JAVA是一种效率很低的语言环境”在一代又一代的程序员中口耳相传,几乎成为了毋庸置疑的真理。

我产生了一个想法,能不能对于同一个应用用几种编程语言分别实现,来比较一下看看到底哪种语言效率最高?

老实说我自己都觉得这个想法很无聊,想想谁会反复用不同的语言写同一个程序呢?下雨天打孩子,闲着也是闲着。再说,对于某种语言的弱点和优势有一个量化的分析,对于我们今后在做项目的时候面临工具选择也少许有一点指导意义。另外,觉得好玩才是我做这件事情的真正原因。

选题

选择一个什么样的程序问题进行这样的测试呢?这是一个很关键的问题,也最容易影响测试的公平性。另外的,对于每种语言,各自的优势都是不同的。程序员的偏爱也是各不相同的。在网上和现实中,对于什么语言更好一些的争论从来就没有停止过。甚至的,各门各派的程序员所构成的各种阵营,把某种语言奉若神明的也不在少数。不信,你在CSDN的JAVA论坛说一句”JAVA执行效率太低了云云”试试?立刻会被铺天盖地的板砖掀翻在地。类似的,还有管理员对于操作系统的偏好和争论:在Linux论坛你要是表扬Windows,其惨烈程度简直是难以言状。因此,从这个意义上来说,程序员们对于编程语言的偏好,类似于战士之喜爱枪械,赛手之喜爱赛车,已经上升为一种精神层面的东西了。蔡学镛先生说得好:有人逢微软必反,有人逢微软必捧。这是一种纯粹的精神上的爱,但它可能会影响正常的、科学的思考。

可以预料的,我这篇文章一定会遭到各路豪杰的迎头痛击。

好了,让我们言归正转吧。首先的,我们的选题中要使用的各种程序语言的最常用的要素。什么是最常用的要素呢?当然了,大家都有的就是赋值、数组操作、循环、判断等。另外,对IO的操作也是编程语言重要的内容。其次的,操作时间一定要长,否则,对于解释性的语言来说是极不公平的:解释器还没调入内存呢,人家编译派的已经运行完了。最后,就是程序不能太复杂。除了我没有那么大的毅力用各种语言完成一个复杂算法的决心外,程序过于复杂,算法在测试中起的作用就越来越大,影响运行效率的原因也就增加了。算法过于复杂,开发工具的扩展部分用得也就越多。于是就成了语言附加库之间的竞赛了,这是我不愿意看到的。

考虑上述因素,我设计了一个简单的选题:从指定文本文件中搜索指定字符串,计算个数。并且打印出搜索到的个数作为结果输出。作为程序员的你粗粗过一下脑子,马上会想到这个算法里面包含了条件判断、循环、数组操作等基本的程序语言因素。这满足了上面第一个条件。另外的,为了满足第二个条件,我准备了一个多达2G的文本文件,总共有文本1500万行多。这保怔了足够的运行时间(但应该不会太长),而决不会一眨眼就执行完了。最后的,我们都知道,在文本串里面搜索子串的算法是数据结构课本中的一个典型的例子(考试也经常被考到的),也满足算法简单的要求。同时,为了让每个程序的环境都一样,我得每测试一次就重新启动一次机器,避免CACHE的影响。

准备

比赛嘛,就需要公平。首先的,硬件平台要统一。我找了一台看起来还不错的机器(服务器):两颗PIII800,1G内存。操作系统嘛,原来的机器上有新装的Windows2000Server版本。几乎没装什么别的应用。我偷懒了一下,没有重新安装OS,就这样用吧。

第一个选手:PERL

如果别人交给我这个题目,我会马上决定用PERL语言来做这件事。这个题目是完全的文本处理问题,还有比用PERL来做更合适的吗?因为PERL是专门为了文本处理而编制的语言。事实上也是这样,我用了2分钟,写了几行代码,就轻松实现了这个问题。这也说明了,选择适用的编程语言工具,比选择喜爱的工具更重要。

#!/usr/bin/perl
$filename=”d:/access.log_”;
$count = 0;
open(FILE , “<$filename”);
while(<FILE>)
{
@match_list = ($_ =~ /HIT/g);
$count=$count+@match_list;
}
close(FILE);
print “Count = $count “;
exit

PERL是一位语言学家Larry Wall发明的,事实上,早期这种语言是专门用于在UNIX平台处理文字文件的(Perl=Practical Extraction Report Language:实用报表析取语言)。后来人们发现有大量文本构成的HTML页面用PERL来做CGI程序生成动态页面再合适不过了。因为互联网的兴起,PERL跟着发大了起来。这种语言的语法和C语言基本类似,因此比较好掌握,并且的,其关于”正则表达式”处理的强大功能目前基本上无人能够望其项背。事实上,类似于”过滤出含有TOM或者ABC的、并且后者的第一个和第三个字母大写,前者最少出现2次,后者出现5次、而且中间间隔8个或4个字母或空格的文本行”。我猜你正在反复的揣摩这句话,事实上,这就是所谓正则表达式,这样的问题,在PERL只需要一行语句就可以完成。在C语言中需要多少语句才能实现呢。

我略略解释一下上面的程序,让没有用过PERL语言的程序员也有个感性认识。

第一行是在UNIX中才用得到,因为PERL是一种基于解释的脚本语言。

第四行是打开文件

下面的循环是一行一行的读文件的内容。循环中间的第一句话是把凡是文本行中含有的HIT全部放到一个数组中;循环中中的第二句话是统计一下刚才的数组中有几个HIT,然后累加起来。循环完成了,我们的任务也就完成了。怎么样,很简单吧?”/HIT/g”就是最简单的正则表达式。br />
现在的PERL语言早已经不是原来的脚本语言形象了,现代PERL几乎具备了其特语言的所有特性,并且的在模块的功能帮助下,可以实现很大的应用。而且还增加了一些面向对象的特点。尽管大多数人仍然在用它处理大量的文本,但也有使用PERL完成大型应用的,尤其是在WEB方面。值得一提的是PERL也是一个跨平台语言。

我的这个程序在测试平台上,使用PERL5.8解释器,用了8分18秒08完成了1500万行文本的扫描,并得出了正确的结果。

第二个选手:纯C

也许年龄大了,但是我真的很喜欢C语言。而且我最喜欢的就是使用指针和强制类型转换来任意操作数据。我甚至会在程序里通过指针手工拼凑一个长整性的数据。说句可能引起争议的话,我觉得JAVA语言抛弃可爱的指针的做法基本上就是逃避。因为掌握不好就不用,到头来就是牺牲了效率。

本文这个题目,用C语言来实现应该还是比较不错的选择。下面的代码就是在VC下面实现的纯C代码的字符串搜索程序(为了避免图形界面的干扰,一律做成控制台程序)。编译的时候使用速度优先编译选项。

#include <stdio.h>
#include <string.h>void main()
{
int len=2048;
char filename[20];//文件名
char buff[10000];//文件缓冲区
char hit[5];
FILE *fd;
int i,j,flag=0,over=0;
int max,readed;
int count=0;//最后的结果
strcpy(&filename[0] , “d:/access.log_”);
strcpy(&hit[0] , “HIT”);
buff[0]=0x0;
buff[1]=0x0;
//打开文件:
if((fd = fopen(&filename[0] , “rb”))==NULL)
{
printf(“Error : Can not open file %s “,&filename[0]);
}
//读取文件内容
while(over != 1)
{
readed = fread(&buff[2] , 1 , len , fd);
if(readed < len)
{
over=1;
max=readed;
}
else
{
max=len;
}
for(i=0;i<max;i++)
{
for(j=0;j<3;j++)
{
if(hit[j] != buff[i+j])
{
flag=0;//一旦有一个不相同就退出并且标志为0
break;
}
else
{
flag=1;//一个相同为1,如果连续都相同最后结果定是1
}
}
if(flag==1)
{
count++;
i+=j-1;
}
else
{
if(j==0)
{
i+=(j);
}
else
{
i+=(j-1);
}
}
}
//把最后两个字符转移到前面两个字节以防止切断搜索串.
buff[0]=buff[max];
buff[1]=buff[max+1];
}
fclose(fd);
printf(“count:%d “,count);
}

程序很好懂,用的也是教科书上面的标准字符串搜索算法,但是比前面的PERL程序长多了吧?那是因为人家PERL已经帮你完成了大部分工作。但是看到上面这段程序的运行结果你可能会高兴起来,它最快一次只用了2分10秒52,最慢也只用了2分20秒59就完成了1500万行文本的搜索任务。平均2分15秒多。为什么每次时间不一样呢?我不清楚具体原因,但学过操作系统的朋友会明白,只有在单道单任务的系统中,代码才能有执行上的可再现性。

有经验的朋友可能会说,你的缓冲区只用了2048字节,加大它速度还会增加呢。是的,而且我相信还有高手能作出更快的程序来,但这不重要,重要的是我们要考察的是不同语言完成同一件工作的效率。而且你能够明白,在程序中,改进什么能够提高效率,这就足够了。因为C语言程序中,这些都是自由可控的。

第三个选手:C++

C++和前面的C是亲戚。我简单的把前面的C代码移植过来,然后把文件输入部分改成了流类对象。至于算法部分嘛。跟前面的C是一模一样的。最后在编译的时候,除了使用速度最佳编译选项外,当然还用了C++的编译参数,因此执行文件的长度比前面的C要长一些,这说明我加的流类代码比标准C库要复杂。是的,C++应该说是目前流行的计算机编程语言中复杂度排名靠前的。其复杂的类和继承关系,以及各种初始化的次序和构造函数执行顺序等都需要考虑。还有多态以及动态联编技术等。C++也是我非常喜欢的语言,提供了面向对象的代码重用特性和足够的安全型,但是在效率上的确比纯C略逊一筹。你知道吗,大部分的操作系统核心几乎都是用纯C写成的,尽管很复杂,但很少有使用面向对象技术的。为什么,不是面向对象技术不好,也不是操作系统核心不够复杂(那什么复杂?),主要的考虑就是效率问题。

#include <stdio.h>
#include <string.h>
#include <fstream.h>void main()
{
int len=2048;
char filename[20];//文件名
char buff[10000];//文件缓冲区
char hit[5];
int i,j,flag=0;
int max;
int count=0;//最后的结果
strcpy(&filename[0] , “d:/access.log_”);
strcpy(&hit[0] , “HIT”);
buff[0]=0x0;
buff[1]=0x0;
//用输入流打开文件:
ifstream input(&filename[0]);
//读取文件内容
while(input)
{
input.getline(&buff[2] , len);
max = strlen(&buff[2]);
for(i=0;i<max;i++)
{
for(j=0;j<3;j++)
{
if(hit[j] != buff[i+j])
{
flag=0;//一旦有一个不相同就退出并且标志为0
break;
}
else
{
flag=1;//一个相同为1,如果连续都相同最后结果定是1
}
}
if(flag==1)
{
count++;
i+=j-1;
}
else
{
if(j==0)
{
i+=(j);
}
else
{
i+=(j-1);
}
}
}

}
printf(“count:%d “,count);
}

这段C++程序在测试平台上用了最快4分25秒95 到最慢5分40秒68的时间完成1500万行的文本检索,并在2G的文件中检索出10951968个”HIT”字符串。这结果是正确的。

第四个选手:汇编

本以为汇编程序能够达到前所未有的高速,把前面的选手远远抛在身后而笑傲江湖。这一想法支撑我完成了艰涩的代码。可事实上测试的结果缺让我大失所望,完全用机器指令书写的程序,去掉缓冲区才几百字节,算法和前面的C程序一模一样,扫描1500万行文本竟然最快也要2分14秒56!这甚至还比不过C语言的最快纪录。而平均下来,汇编程序的速度竟然和前面的C程序在伯仲之间。恐怕这样的结果也出乎大部分人的意外。因为我们从入行的那一天起,就被告知汇编是你所能够掌握的最快的语言!尽管代码坚涩难懂,但性能的代价是值得的。而从这里的测试看,你觉得向下面这样的代码,实现和C语言一样的速度和功能值得吗?

;堆栈段
STSG SEGMENT STACK ‘S’
DW 64 DUP(?)
STSG ENDS;数据段
DATA SEGMENT
rlength EQU 2048
fname DB ‘access.log_’,0
hit DB ‘HIT$’
fd DW ? ;文件句柄
resault DB ‘count : $’ ;结果提示
count DD 0 ;存放结果
disflag DB 0 ;显示标志
buff DB 5000 dup(0) ;缓冲区
DATA ENDS

;代码段
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA,SS:STSG,ES:NOTHING
MOV AX,DATA
MOV DS,AX
;我的代码开始:
mov ah,3dh ;打开文件
lea dx,fname
mov al,00h ;文件打开方式
int 21h ;开始操作
;这里就不作错误处理了,偷懒喽!
;CF=0表示正确,CF=1表示错误,AX是文件句柄或者是错误代码
mov fd,ax ;保存文件句柄

READ: mov ah,3fh ;读文件
mov bx,fd ;文件句柄
mov cx,rlength ;要读length字节

lea dx,buff ;给出读缓冲区指针
add dx,2 ;缓冲区指针向后错两个(目的是解决边界问题:有一个HIT正好横跨rlength界限)
int 21h ;开始读
;AX里面是实际读出的字节数
;读完了以后,扫描缓冲区
push ax ;保存AX字节数
cmp ax,0
jz ALLEND ;文件读完了就退出

sub dx,2 ;指针向前错2个,
mov si,dx
add dx,2 ;把指针回到原来的位置
add dx,ax ;计算结尾
LOD3: cmp si,dx ;到头了就重新读一次文件
jz OVR
lods buff
lea bx,HIT
cmp al,[bx]
jnz LOD3 ;读第一个字节不相等就重新读一个

cmp si,dx
jz OVR
lods buff
cmp al,[bx+1]
jnz LOD3 ;如果第一个字节相等,就读第2个字节,不行等就从第一个字节再重比较。

cmp si,dx ;如果第二个字节也相等的话,就比较第三个字节。
jz OVR
lods buff
cmp al,[bx+2]
jnz LOD3 ;第三个字节不相等再从头开始
;有一个HIT匹配
push bx
lea bx,count
add WORD ptr [bx],1 ;计数器增加一个
adc WORD ptr [bx+2],0 ;进位
pop bx
jmp LOD3

OVR: mov ah,[si-1]
mov BYTE ptr buff+1 , ah
mov ah,[si-2]
mov BYTE ptr buff , ah

pop ax ;恢复这次总共读出的字节数
cmp ax,rlength ;看看是不是最后一次(剩余的零头)
jz READ
;如果是最后一次读文件,

ALLEND: mov ah,3eh ;关闭文件
mov bx,fd ;文句柄
int 21h ;关闭文件

mov ah,9 ;显示结果字符串
lea dx,resault
int 21h

;转换2进制结果到10进制ACSII形式
mov bx, WORD ptr count
call TERN

mov ax,4c00h ;返回DOS
int 21h
;结束代码,最大的数字已经排到了最前面
MAIN ENDP

TERN PROC ;这个子程序是转换并显示2进制数字的
mov cx,10000
call DEC_DIV
mov cx,1000
call DEC_DIV
mov cx,100
call DEC_DIV
mov cx,10
call DEC_DIV
mov cx,1
call DEC_DIV
ret
TERN ENDP
DEC_DIV PROC
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
add dl,30H
mov ah,disflag ;read flag
cmp ah,0
jnz DISP ;已经显示过有效数字了
cmp dl,30H
jz NODISP
mov disflag,1 ;作用是第一个有效数字出现前不显示0
DISP: mov ah,2
int 21H
NODISP: ret
DEC_DIV ENDP
CODE ENDS
END MAIN

上面这段代码我猜你也懒得仔细阅读。其实他不能”显示结果”。因为最后这段负责把最终结果转换成可显示ASCII码的程序实际上只能转换二进制十六位的数据,而最终的结果高达1000万挂零,显示会出错。由于这最终结果的显示已经和程序的运行没有大关系了,因此,我也就懒得去写一个32位的ASCII转换程序了。就这样吧。

第五个选手:JAVA

JAVA是一个不能不参加比赛的选手。有如此多的人热爱他,他们中的一半人是因为JAVA的面向对象特性以及良好的跨平台特性。而另一半人纯粹就是因为JAVA不姓”微(软)”,这就是意识形态在程序员头脑中对某种语言的注释。单纯从语言元素上来说,我还是比较喜欢JAVA的。因为他的语法干净、简洁。环境也好。虽然用虚拟机系统(JVM)的做法来实现跨平台特性并非什么了不得的创意(像不像30年前的BASIC解释器?别跟我说什么中间代码?几乎所有的解释器都是把语言因素翻译成中间代码的,JVM不过是分成2步来实现罢了,但从运行机制上应该是差不多的。),但JVM仍然将JAVA的跨平台特性做到了前所未有的地步。而且JVM是一个很干净的系统,让人用起来赏心悦目。说到这里我忍不住想提一下J2EE企业应用框架了。不知道有多少人能够看懂SUN出的J2EE的”理论著作”?满纸充斥着各种生造的概念,洋溢着溢美之词。JAVA的企业应用框架实在是比较复杂的东西,虽然赶不上后来的.NET框架,但足以让大多数初学者望而却步。一句话,东西太多了。事实上JAVA的企业级应用并没有想象的成功,iPlanet就随着电子商务概念的全面垮台而渐渐淡出。现在换了个名叫“SUNONE”――SUN公司员工原话。

我们回到JAVA的语言元素上来说,实际上JAVA可以被理解为被纯化的C++。JAVA去除了C++为了兼容C而增加的一些”非面向对象特质”,用其他的一些变通办法实现C++直接实现的功能,比如:多继承。在实现机制上,JAVA的程序会先编译成.CLASS文件,然后这种跨平台的中间代码就可以”一次编译,到处运行”了。当然必须运行在有JVM虚拟机的环境中,连图形什么的都可以照搬。换句话说,你用JAVA程序在PC屏幕上画一个圆,在JAVA-PDA上它还是圆的。

我在本次测试中,写了下面的代码,用JAVA做了同样的测试,测试中实际上用到了:JAVA的文件流类,运行了循环、条件判断、数组操作等基本的语言因素。环境是J2SE1.3.1-06。JAVA程序做1500万行的文本扫描用了8分21秒18。应该说是几种语言中最慢的,基本上和纯解释的PERL是在同一水准。J2EE的JVM环境还是经过优化的所谓HOTSPOT。

import java.io.*;
public class langtest
{
public static void main(String[] args)
{
String filename = “d:/access.log_”;
try
{
count(filename);
}
catch (IOException e)
{
System.err.println(e.getMessage());
};
}public static void count(String filename) throws IOException
{
long count=0;
long len;
String strline = “”;
char hit[] = {‘H’,’I’,’T’};//要搜索的字符串
char buff[] = new char[2100];

Reader in = new FileReader(filename);//用FileReader类构造产生一个Reader类对象
LineNumberReader line = null;//生成一个空指针
try
{
line = new LineNumberReader(in);//建立LineNumberReader类对象
while((strline = line.readLine()) != null)
{
//到这里已经读出一行了,用下面的代码分析这行有几个HIT
int i=0,j=0,max=0,flag=0;
buff = strline.toCharArray();//转换成字符数组
max = strline.length();

for(i=0;i<max;i++)
{
for(j=0;j<3;j++)
{
if(hit[j] != buff[i+j])
{
flag=0;//一旦有一个不相同就退出并且标志为0
break;
}
else
{
flag=1;//一个相同为1,如果连续都相同最后结果定是1
}
}
if(flag==1)
{
count++;
i+=j-1;
}
else

{
if(j==0)
{
i+=(j);
}
else
{
i+=(j-1);
}
}
}
}
System.out.println(“Count : “+count);
}
catch (IOException e)
{
System.err.println(e.getMessage());
}
finally
{
try
{
if(in != null) in.close();
}
catch (IOException e)
{
}
}
}
}

候捷先生翻译的宏篇巨著《JAVA编程思想》一书中第67页说到:”使用最原始的JAVA解释器,JAVA大概比C慢上20到50倍”之说法我在阅读的时候就心存疑虑,心想要是这样,JAVA完全没有存或与世间的必要了。在亲自动手试验过后,我觉得说JAVA在J2EE环境下,比C慢上2-3倍还是比较可靠的说法的。况且,目前越来越多的硬件JVM的诞生,也给JAVA越来越多的机会。不过我担心的正是这点,JVM的多厂家多样化很可能会造成某些兼容性方面的问题。例如我见过一篇文章就是讨论某种JAVA程序在IBM-JVM可用而在SUN-JVM上不可用之事例。但愿的,JAVA能健康成长。

总结

事实上,本文有两个基本的意义传递给初做程序员的读者:

一、 抛开你的意识形态好恶,选择最合适的编程语言来完成你的工作。每种流行的语言都有自己存在的意义。

二、 在编程中,有想法就自己做一做,你会得出自己的结论。

至此,你应该明白,前面的所有测试结果其实并不重要,重要的是你了解了这些语言的特质,也许在今后的编程生涯中会因此增加一点点”经验”呢。

后记

本来笔者还打算继续测试一下另外的一种颇为流行的解释语言Python和新贵C#以及在Linux平台完成这些测试,但终究还是被懒惰瓦解了斗志。好在的,Python和Perl比较相似,而C#和JAVA有异曲同工之妙。也可以略略做一点参考。

事实上,本文测试中有一个大大的不公平之处,相信仔细的读者已经发现了:其中C和ASM都是使用缓冲区直读的办法,不管三七二十一就进行判断(最后用指针检查缓冲区边界)。而C++等其他的语言虽然用了非常方便的流按行读出,但是多做了很多事情:每一个字符都要判断其是不是回车换行符,而按行读近来,每次缓冲的也要少很多。因此其他几种语言就大大的吃亏了。不过这并不影响结论性的东西,因为测试本身就说明越方便就效率越低。事情总是要有人做,不是吗?

2003-05-17■作者:阿谭■出处: yesky

只能说明文件的I/O操作是最费时的,其实应该说java和C的效率是有数量级的区别的,C代码中80%以上的时间都花费在I/O上了,C++除了I/O之外在流的处理上也发费了交多的时间,这是本次测试中C++比C慢就慢在这儿,很显然java的运行期消耗已经和I/O处于相当的数量级,因此实际消耗时间是C的3到4倍.perl的运行期原理不是很清楚.

http://blog.csdn.net/worldpharos/article/details/3931483

电商导购过冬:蘑菇街酝酿出售 美丽说转型时尚

电商导购过冬:蘑菇街酝酿出售 美丽说转型时尚

腾讯科技讯 王可心 10月24日消息

一度红火的第三方导购网站正因为阿里巴巴过山车式的态度而呈现出急剧下滑的轨迹。

2011年,以美丽说、蘑菇街为代表的导购网站蜂拥而起。彼时,两者还能频繁出现在阿里巴巴的官方活动中。然而,2012年5月,阿里巴巴集团董事局主席马云在内部讲话时表示不扶持上游导购网站继续做大。此后,蘑菇街们就开始了“被打压”下的生存。据导购行业知情人士透露,阿里巴巴一直在收紧对导购网站开放的API接口。

据悉,前段时间阿里巴巴对蘑菇街等大型导购网站的佣金接口进行了限制,这将直接影响导购网站的营收来源。

不过,阿里巴巴并非要将导购网站“置于死地”。今年9月16日,淘宝网宣布,其导购类分享平台优站将正式向第三方导购网站开放。同时,阿里巴巴设立了5亿美元的基金,用于投资并扶持第三方导购网站等外部合作伙伴。

这笔基金将首先应用在收编蘑菇街。据丁香园技术负责人冯大辉透露,阿里巴巴正在与蘑菇街洽谈收购。腾讯科技从多处投资人士了解到,双方已达成初步意向,但尚未达成最终交易。阿里巴巴集团和蘑菇街双方也未对此事给予否认。

从打压到收购,有业内人士将其称为“打一巴掌,给个甜枣”。“从业务上看,阿里巴巴确实需要蘑菇街带来优质的流量,但又要对其掌握控制权;从估值来看,先打压,可降低蘑菇街的估值。”

如果难以独立发展,阿里巴巴也是蘑菇街较好的归宿。蘑菇街是“阿里系”创业团队,四位联合创始人中的三位(陈琪、岳旭强、李研珠)皆来自阿里巴巴,收购后在文化融合上不存在什么障碍。

打压

自从去年5月份,马云在内部发表“不扶持上游导购网站继续做大,阿里巴巴的流量入口应该是草原而不是森林;不扶持返利类网站”观点后,阿里巴巴对淘宝客政策进行了调整。

今年以来,有导购网站对腾讯科技透露,阿里巴巴对导购网站的政策进一步收紧,限制导购网站对API接口的调用次数,导致无法抓取更多的数据,无法扩大规模。

“就像一个水龙头,以前水龙头里的水是无限使用的,现在受到诸多限制。”上述人士称。

据某大型导购网站相关人士透露,淘宝开放的接口一直在缩减。目前,除了一些最基础的接口,技术类接口如商品评价接口、过往价格接口等都做了很多限制。

最近,淘宝对相关佣金接口进行了限制。有淘宝卖家对腾讯科技透露,之前的淘宝宝贝上架,名称中有“蘑菇街”的内容无法发布成功。

“限制佣金接口,意味着营收来源被切断,这对以佣金为主要收入来源的导购网站是致命的。”上述导购行业人士称。

但阿里巴巴方面表示并未封杀美丽说、蘑菇街,而是邀请其加入优站。今年9月份,淘宝网推出优站,优站是淘宝官方导购平台,由多家第三方导购、达人等提供导购内容,共同汇聚成一个社会化的导购平台。

优站与第三方导购的不同之处在于,优站可把握用户访问这些导购网站的数据。例如,以前,用户访问某导购网站,数据从导购网站,再到淘宝。导购网站加入优站之后,数据则从淘宝,到导购网站,再到淘宝完成交易。

财猫浏览器、好贷网创始人李明顺(微博)认为,淘宝对这些数据拥有控制权,实际上成为了导入“入口的入口”,“这对第三方导购是‘改良式的围剿’。”

据悉,淘宝网与蘑菇街此前曾就优站合作进行洽谈,但蘑菇街并没有入驻。“如果加入优站,需要按照优站的体系来做。而蘑菇街的用户习惯已经形成,如果从优站访问,会有一些不适应。”

收购

对于最近爆出的阿里巴巴欲收购蘑菇街的消息,李明顺认为,“这是一个意料之外,情理之中的事。”

先打压后收购的逻辑是什么?

李明顺认为,阿里巴巴对导购市场的态度是“打一棒子,给点糖吃”,这对于阿里巴巴来说,更有谈判权、控制权,也是压低估值的做法。

传闻称,阿里巴巴收购蘑菇街出资2亿美元。由于最终交易尚未完成,这一数字尚无从考证。不过可以比较的是,这一数字或不及蘑菇街第三轮融资时的估值。

此前,蘑菇街共进行过三轮融资:2011年,蘑菇街进行过两轮共计2000万美元的融资,A轮投资方中有贝塔斯曼,B轮投资方为启明创投。2012年10月,完成C轮融资,IDG领投。有消息称,蘑菇街第三轮融资时估值超过2亿美元。蘑菇街公关负责人徐达也未否认低价收购一事。

另一方面,从业务上来看,阿里巴巴收购蘑菇街可弥补社区产品短板。阿里巴巴对于外部优质流量有两种态度:一是渴求,二是担心不可控。因此,既要获得优质流量,又想可控,最好的办法是入股或收购。”互联网评论人士洪波(微博)说。

从打压到收购,洪波认为,最大的原因在于“压不住”。“对于阿里巴巴集团商户来说,内部流量买不起,有寻求外部廉价流量的需求。阿里巴巴很难真正封的住。”

除了入股新浪微博、收购蘑菇街等外部优质流量,阿里巴巴集团内部也一直在探索社会化产品,如推出类Pinterest产品哇哦、购物分享平台爱逛街、图片互动社区顽兔、兴趣图谱网站圈子等,但流量不及美丽说、蘑菇街等第三方导购站。

洪波认为,阿里巴巴自己难做成社会化产品的原因在于,缺少用户日常的关系,更多的是买卖关系。因此,阿里巴巴自己的社会化平台往往变成营销专家活跃的地方,而不是用户活跃的地方。

整体来看,阿里巴巴仍在加大对社区产品的资源投入力度,淘宝优站、爱淘宝皆在新版淘宝网首页呈现。

突围

经历了辉煌期和低迷期,蘑菇街的发展是导购行业的一个缩影。

导购业态的天花板明显。华平投资顾问黄若在其《我看电商》一书中指出,导购是一个主要依赖于淘宝环境生存的业态,其经营土壤,全仰仗阿里巴巴。“人家只要阀门一关,这个业态就集体下岗。”

在这个大环境下,导购网站正寻求突围。要么转型,要么多平台发展。

据了解,蘑菇街竞争对手美丽说已经淡化导购色彩,定位时尚媒体,做时尚杂志与互联网的结合体。一方面引导潮流,另一方面用户产生内容。除了导购收入,媒体可以带来的是影响力和广告收入。

“美丽说与蘑菇街的性质已经不同了。虽然在外部看来,美丽说还有导购的模式,但不管是内部架构还是未来策略,都在慢慢弱化导购的概念。”一位接近美丽说的人士说。

突围的另一种方式是提升其他电商平台的比例,如加大和京东、易迅、1号店、苏宁等平台的合作。

不过,在淘宝占据中国网购市场70%市场份额、导购需求主要集中在服饰护肤、母婴、家居等垂直领域的背景下,现阶段这一转变并不容易实现。

谷歌推出反网络审查软件uProxy:不支持微软IE

“uProxy”目前还在测试阶段,初期将仅支持谷歌Chrome、火狐Firefox

【TechWeb报道】10月22日消息,据国外媒体报道,谷歌日前在纽约展示了一款名为“uProxy”网络代理软件,该软件旨在帮助用户绕过网络审查,自由访问互联网。

“uProxy”项目由华盛顿大学和非功利组织Brave New Software研发,由谷歌提供资金资助。该软件的工作原理是,通过将两个用户以加密的形式连接起来,构成一个虚拟网络,最终绕开审查。

“uProxy”目前还在测试阶段,初期将仅支持谷歌Chrome、火狐Firefox,不支持微软Internet Explorer。(小峰)

http://www.chinaz.com/news/2013/1022/323139.shtml

微信游戏成功的秘密:经典的产品推进布局

截至九月底,微信“游戏中心”一共推出了5款游戏:经典飞机大战、天天连萌、天天爱消除、节奏大师、天天跑酷。

自从微信推出“经典飞机大战”开始,手游界便遭腾讯横扫。微信的“游戏中心”使得腾讯由一家移动端游戏偏弱的公司,转瞬之间成为中国移动端游戏玩家数量最多(约1亿),收入最高的“手游公司”。经典飞机大战成为“全民游戏”,而最新推出的游戏“天天跑酷”仅用时一天半便在Appstore收入榜上正式超越《我叫MT》成为第一,日入500万元。

微信游戏的成功,并不是简单一句“用户多,再加入点社交”所能概括的,微信游戏的崛起蕴藏着腾讯深邃的产品观,值得探究。微信“游戏中心”推出的五款游戏,本质上可以分为三类,体现出了腾讯细腻的产品逻辑,以及稳健的产品推进大局观。

1.掀起全民游戏:经典飞机大战

其实,从微信推出游戏的名称中,便可以窥探出微信游戏战略推进的蛛丝马迹。经典飞机大战,主打的是“经典”怀旧,飞机大战这个游戏类型脱胎于最早红白机射击游戏《小蜜蜂》,被很多游戏继承过,只要对电子产品有所接触,从60后直到00后,对这个模式游戏都不陌生,这为“打飞机”成为全民游戏打下了基础。

而微信也刻意营造着“打飞机”的话题性,从微信5.0进入页面推荐“打飞机”,到让人遐想的名称,再到先推出iOS版刻意的饥渴营销,使得打飞机”话题性一时无双,人人欲打之而后快。

“话题性”+“经典怀旧”+“社交排名”,在三重力场的挤压之下,几乎所有微信用户都对打飞机这款游戏进行了尝试。不管“打飞机”这款游戏后续会如何,在战略意义上“打飞机”是极其成功的,它本身是作为微信游戏“攻城”之作:让所有人知道微信游戏,让大部分人尝试微信游戏。毫无疑问,“打飞机”出色的完成了任务。

2.碎片化标准手游:天天连萌、天天爱消除、天天跑酷

“天天系列”都是标准的手游类型游戏:易上手、符合碎片时间、轻操作。微信游戏在用“打飞机”制造出足够大的动静之后,需要用这些典型手游去留住“标准的”手游玩家。

手机游戏目前的主要功能还是供人们消遣,打发碎片时间用,远未达到端游或街机高粘性和深度游戏文化水准。微信游戏现在祭出三款“天天系列”手游,是标准的“守势”。“天天连萌”、“天天爱消除”游戏时长被限定在1分钟之内,以及易上手的操作方式,都是普通用手游来打发碎片时间用户的最好选择。一批玩家将被沉淀进入“天天系列”中,天天去玩一玩微信中的手游打发时间。

3.窥探手游的边界之重:节奏大师

“节奏大师”是微信游戏对现代手游形态天花板的探究之作,一探“手游不能承受之重”。“节奏大师”作为一款MUG(音乐游戏),其闯关模式、后期难度,游戏时长(平均2分半钟)、以及操作方式都过于“沉重”,不符合目前手游“用来打发时间”的游戏形态。与“节奏大师”相类似的MUG游戏如“太鼓达人”、“跳舞机”都是街机游戏中的经典,虽然不可能是最受欢迎的游戏,却能黏住一部分核心玩家,形成良好的“玩家圈子”和“游戏文化”,这也是目前手游所欠缺,所需要突破的瓶颈。

节奏大师的“重”,是腾讯期望“突破”手游轻形态的试水之作,但是目前看来,情况并不乐观。例如,有的玩家吐槽微信游戏每周清空排行榜,根本就不利于节奏大师这样的“重型游戏”核心玩家刷存在感,自己“闯了100关的记录就这么没了”——改变手游轻形态并没有那么容易,因为“轻”是手游现在的基本基因,手游设计者潜意识就这么认为,很难突破。

最后

微信游戏在产品布局上的逻辑,是根据现有手游产业产品形态进行三步推进:攻城(打飞机)→守势(天天系列)→试图突围(节奏大师)。这三步棋走得十分稳健并且具备紧密的逻辑性,攻守兼备的同时也让腾讯很好的探究到了手游的边界。目前看来,手游迈向“重型游戏”还有难以突破的藩篱。

关于作者

如果你也关注创业创新领域,那么请关注韦物主义(微信号:weiwuzy)

http://www.chinaz.com/start/2013/0925/319308.shtml

2012高考学弟学妹们,加油!