`
acme_ltt
  • 浏览: 53694 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

thrift和erl_nif效率上的比较

阅读更多

      thrift是通用型的,可以完成多种编程语言之间的交互,erl_nif是专用型的,主要完成Erlang和C语言之间的交互。thrift可以完成远程节点之间的交互,但是erl_nif只能完成本地的交互。

  正因为thrift完成的是远程节点之间的交互,(thrift在facebook设计指出,主要的目的就是完成facebook数据中心中不同编程语言之间的交互)它在处理本地交互时,同样会看作是远程的方式进行工作;erl_nif的运行中,省去了远程节点的通信。所以,thrift的运行性能不如erl_nif的运行性能。

  但是,如果要完成远程节点之间的语言交互,使用erl_nif,也不见得有多大优势。首先,远程之间之间的交互,必然要使用通信,就算是用原生的socket进行通信,性能上面而言,优势也甚微。但是,如果使用这种方式,开发效率就大大的降低了。

  所以,如果在本地要完成C语言和Erlang语言之间的交互的话,使用erl_nif是没有错的(使用指南,可以google一下),但是如果要完成远程节点之间多编程语言的交互,选择thrift在一定程度上,还是要比erl_nif好。

 

贴出thrift完成CPP+Erlang计算100W以内prime的代码

     CPP端的代码

 

#include <stdio.h>
#include <iostream>
#include <vector>
#include <unistd.h>
#include <math.h>
#include <sys/time.h>

#include <protocol/TBinaryProtocol.h>
#include <transport/TSocket.h>
#include <transport/TTransportUtils.h>

#include "../gen-cpp/Sendinfo.h"

using namespace std;
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;

using namespace cpp2erl;
using namespace shared;

using namespace boost;
bool isPrime(int i)
{
    int j;
    int t = sqrt(i) + 1;
    for(j = 2; j <= t; ++j)
    {
        if(i % j == 0)
        return false;
    }
    return true;
}
int main(int argc, char** argv) 
{
    shared_ptr<TTransport> socket(new TSocket("localhost", 9909));
    shared_ptr<TTransport> transport(new TBufferedTransport(socket));
    shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
    SendinfoClient client(protocol);
    
    timeval end,start;
    try {
        gettimeofday(&start,NULL);
        vector<int> Mylist;
        for(int i=0;i<1000000;i++)
        {
            if(isPrime(i))
            {
                Mylist.push_back(i);
  	        }
  	    }
  	    gettimeofday(&end,NULL);
  	    transport->open();
 	    client.sendinfo(Mylist);
 	    long timeuse = 1000000*(end.tv_sec-start.tv_sec)+end.tv_usec-start.tv_usec;
 	    cout<<timeuse<<endl;
 	    transport->close();
 	    }
 	    catch (TException &tx) { 
 	        printf("ERROR: %s\n", tx.what());
 	    }
}

 

 Erlang端的代码

 

-module(server).

-include("sendinfo_thrift.hrl").

-export([start/0,start/1,handle_function/2,stop/1,ping/0,zip/0,debug/2,sendinfo/1]).

debug(Format, Data) ->
    error_logger:info_msg(Format, Data).

ping() ->
    debug("ping()",[]),
    ok.


sendinfo(Mylist) ->
	{Nodename} = {Mylist},
	debug("~w~n", [Nodename]).

zip() ->
    debug("zip", []),
    ok.

%%

start() ->
    start(9909).

start(Port) ->
    Handler   = ?MODULE,
    thrift_socket_server:start([{handler, Handler},
                                {service, sendinfo_thrift},
                                {port, Port},
                                {name, tutorial_server}]).

stop(Server) ->
    thrift_socket_server:stop(Server).

handle_function(Function, Args) when is_atom(Function), is_tuple(Args) ->
    case apply(?MODULE, Function, tuple_to_list(Args)) of
        ok -> ok;
        Reply -> {reply, Reply}
    end.
 

测试:

1、测试thrift的额外消耗,修改CPP代码

 

gettimeofday(&start,NULL);
transport->open();
transport->close();
gettimeofday(&end,NULL);
long timeuse = 1000000*(end.tv_sec-start.tv_sec)+end.tv_usec-start.tv_usec;
cout<<timeuse<<endl;

 

 transport open动作和close动作,需要消耗的时间在2462微秒左右(测试十八个数据,取其平均值)

可以看出,因使用thrift而产生的额外消耗,只有0.2462毫秒,与使用thrift带来的开发效率的提高,可以忽略不计。

2、thrift传输产生的消耗,同样需要修改下CPP代码

 

gettimeofday(&start,NULL);
client.sendinfo(Mylist);
gettimeofday(&end,NULL);
long timeuse = 1000000*(end.tv_sec-start.tv_sec)+end.tv_usec-start.tv_usec;
cout<<timeuse<<endl;

 测试thrift完成传输需要消耗的时间,1545771微秒,也就是1.5秒左右

3、测试整个过程需要的时间

测试从判断prime到传给erlang 所需要的时间,1876668微秒,1900毫秒左右,和erl_nif完成该工作,相差了1秒左右,(参见:http://www.iteye.com/topic/534368

 

总结:

     虽然,thrift和erl_nif运行效率相比,确实不行,但是,thrift完成的多语言交互,可以轻松部署到远程节点,不仅如此,开发效率还要比erl_nif稍胜一筹(个人观点)。

     君子性非异也,善假于物也。

分享到:
评论

相关推荐

    erlang版本的protobuf(erl_protobuffs)

    1. **性能提升**:`erl_protobuffs`经过优化,相比其他Erlang的protobuf实现,如`protobuf-erl`或`thrift`,其解析和编码速度更快。这得益于Erlang自身的并发特性和轻量级进程,以及`erl_protobuffs`内部的高效算法...

    thrift_castle2t1_thrift_Known_

    这些文件对于构建和运行"thrift_castle2t1"项目是必不可少的,它们提供了运行Thrift服务所需的所有工具和依赖。 总的来说,"thrift_castle2t1_thrift_Known_"这个项目揭示了一个基于Thrift构建的成熟服务,其源代码...

    thrift_java_demo和安装包

    在“thrift_java_demo和安装包”中,我们主要关注两个方面:Thrift的安装和Java的测试项目。 1. **Thrift的安装**: - 下载:你提供的压缩包文件名是`thrift-0.9.3`,这表明它包含了Thrift的特定版本0.9.3。首先,...

    PyPI 官网下载 | thrift_amqp_tornado-0.0.2.tar.gz

    该包名为`thrift_amqp_tornado`,版本号为0.0.2,以`.tar.gz`格式压缩,这是一种常见的Linux和Unix系统中用于归档和压缩文件的方法。 `thrift_amqp_tornado`这个名字暗示了它可能是一个集成了Thrift、AMQP和Tornado...

    Thrift 示例代码_Java

    总之,Thrift 示例代码 Java 版本提供了一个直观的学习平台,帮助开发者了解如何使用 Thrift 构建分布式服务,从而提升系统间的通信效率和开发效率。通过实践和理解这个示例,开发者能够更好地掌握 Thrift 的工作...

    Python库 | ctec_thrift_client_py3-1.0.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:ctec_thrift_client_py3-1.0.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    编译的spark-hive_2.11-2.3.0和 spark-hive-thriftserver_2.11-2.3.0.jar

    spark-hive_2.11-2.3.0...spark-hive-thriftserver_2.11-2.3.0.jar log4j-2.15.0.jar slf4j-api-1.7.7.jar slf4j-log4j12-1.7.25.jar curator-client-2.4.0.jar curator-framework-2.4.0.jar curator-recipes-2.4.0.jar

    thrift-parser_2.9.1-2.0.0-M2.zip

    1. **Thrift**:Thrift 是一种跨语言的、高性能的、可扩展的服务框架,它提供了 IDL(接口定义语言)来定义服务和数据结构,然后自动生成多种编程语言的客户端和服务器端代码。 2. **Thrift 解析器**:Thrift 解析...

    thrift_sasl-0.3.0.tar.gz

    6. **版本兼容性**:0.3.0 版本可能包含了一些新的特性、性能优化或bug修复,以增强Thrift SASL 的稳定性和效率。 7. **部署与集成**:了解如何在实际环境中部署Thrift SASL,包括设置SASL配置文件、配置Thrift服务...

    gen-cpp.rar_CppServer.cpp_gencpp_thrift_thrift gen_thrift gen-cp

    本例是一个简单的thrift测试程序,包括客户端和服务端。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

    spark-hive-thriftserver_2.11-2.1.3-SNAPSHOT-123456.jar

    spark-hive-thriftserver_2.11-2.1.spark-hive-thrift

    thrift_flask_app:Flask的第二个项目

    以上是对thrift_flask_app项目中可能涉及的关键知识点的详细说明,涵盖了从后端开发到前端呈现,再到部署和实际应用的全过程。通过这样的项目,开发者不仅可以深化对Flask框架的理解,还能锻炼到项目管理、数据库...

    spark-hive-thriftserver_2.11-2.4.5.jar

    spark和hive结合依赖,如何使用请看我博客https://blog.csdn.net/z1987865446/article/details/109372818

    thrift_forPython3_0.9.3

    标题 "thrift_forPython3_0.9.3" 指的是一个针对Python 3的Thrift库的特定版本,版本号为0.9.3。Thrift是一种跨语言的服务开发框架,它允许开发者定义服务接口和服务数据类型,然后自动生成在多种编程语言中使用的...

    hbase_hive_thrift_php

    标题 "hbase_hive_thrift_php" 暗示了我们正在探讨的是一个涉及HBase、Hive、Thrift和PHP的技术组合。这些组件在大数据处理和数据分析领域中扮演着重要角色。下面是关于这些技术及其相互关系的详细解释: 1. **...

    test_hive.rar_ThriftHive.php_hive_hive php_php hive_php hive Thr

    Thrift允许不同的编程语言之间进行高效的数据序列化和远程过程调用(RPC)。在这个场景下,它作为PHP和Hive之间的桥梁,使得PHP开发者能够方便地调用Hive服务,执行数据查询和处理。 标签中的“thrifthive.php”,...

    php_thrift_python安装测试记录

    本篇文章将围绕“php_thrift_python安装测试记录”这一主题,深入探讨如何在PHP中使用Thrift客户端调用Python服务端,并分享相关的安装步骤和代码示例。 首先,我们来看Thrift的基本工作原理。Thrift通过一种中间...

    thrift

    Thrift Erlang软件库 执照 根据一项或多项贡献者许可协议获得了Apache Software Foundation(ASF)的许可。 有关版权拥有权的其他信息,请参见随此作品一起分发的NOTICE文件。... 1 &gt; { ok , C0 } = thrift_client_uti

    Python库 | thrift_pyi-0.2.0-py3-none-any.whl

    这个压缩包“thrift_pyi-0.2.0-py3-none-any.whl”是一个预编译的Python wheel文件,适用于Python 3版本,且不依赖特定的系统架构或Python ABI(应用程序二进制接口)。 首先,让我们深入了解Thrift。Thrift是一种...

Global site tag (gtag.js) - Google Analytics