paip.提升性能--多核cpu中的java/.net/php/c++编程









作者Attilax  艾龙,  EMAIL:1466519819@qq.com 

来源:attilax的专栏

地址:http://blog.csdn.net/attilax









////////////////目前情况

需要一个处理50w行的文件,按行进行分词..需要50s才能完成..

经过调试,瓶颈在这个代码上... TokenStream ts = Analyzer.tokenStream("", reader); 换成IKSegmenter方式,还是一样.,
// IKSegmenter ik=new IKSegmenter(reader, true);

机器环境:win7 64bit..cpu双核,2.7g...内存8g

查看cpu使用,仅仅使用了1个cpu,另外一个空闲着了...要全部使用了,性能应该能行提升2倍了..





 

////////////使用多线程来提升多核cpu的性能..

多核随着硬件的不断升级,作为计算机核心的CPU也改头换面,成为一颗多心的家伙。设计它的专家声称这可以最大限度地提高程序的运行效率。但事实真的如此吗?众所周知,现在的程序大多都是基于单线程而设计的,然而这种设计模式如果在主频高的单核CPU上运行,效率是非常高的。但它并不能很好地协调多核一起工作。





更不幸的是单线程的程序在多核CPU上运行甚至可能会没有单核CPU快。





当然,就目前而言,要解决这种性能软瓶颈的最佳方法就是本专题所讨论的多线程编程。只有充分利用这种技术,才能发挥多核的最大潜力。好了,就说到这吧,最后让我们利用本专题所讲的内容尽情地享受多核给我们带来的惊喜和刺激吧!









2、线程分解和执行的区别:

对单核CPU,对客户端软件,采用多线程,主要是 创建多线程将一些计算放在后台执行,而不影响用户交互操作。(用户界面 & 其他计算 并行进行)提高用户的操作性能!





多核中,分别出多个线程,不再限于将用户界面操作和其他计算分离。分解多个线程使为了让计算分配到各CPU上执行。执行线程数量与CPU核数有关!如果线程数小于核数,某些CPU肯定处于空闲状态。





3、CPU核负载平衡:

单核中不考虑 负载平衡,各个线程计算量相差很大,也不会影响程序总计算时间。

多核中,必须考虑将各个线程计算量均衡到各CPU





7、串行计算与并行计算、分布式计算的区别

单核多线程编程中,都是串行算法。用不到并行计算,更用不到分布式计算

多核编程中,多采用 并行计算 和 分布式计算





并行计算=并行设计模式+并行算法

分布式计算复杂度 > 并行计算的复杂度 > 串行计算复杂度





并行计算:只考虑计算并行地执行,不考虑线程间的竞争导致CPU饥饿

分布式计算:相比并行计算,能更好解决CPU饥饿,使计算均衡地分配任务到各内核





/////////////////代码如下:

经过测试,因为仅仅有2个cpu核心,走凯里2个线程..果然,2个cpu占用都块道理100%的兰,时间一挂噪城里原来的一半儿..25s走ok兰...

List<String> lica7 = fc.fileRead2list(sourceTxt, "utf-8");

int mid = lica7.size() / 2;

final List<String> lica7_half1 = lica7.subList(0, mid);

List<String> lica7_half2 = lica7.subList(mid, lica7.size());

new Thread>>>>

lica7_half1_result = ftc.fentsiMuilttheard(lica7_half1,

wordLibs, "thd1");

half1_isfinesh=true;

//main thread

//wait 4 half_thread_finish

//habin lyag list..









/////////////true code.











List<String> lica7_half1_result;

boolean half1_isfinesh=false;





/**

* @author attilax 1466519819@qq.com

* @param sourceTxt

* @param targetTxt

* @param wordLibs

*            for file line >5w bacause 50w time tooo long ,gujyi

*            1min...muset rewrite jeig swefa.

* @since cae

*/

public void fentsi4bigfile(String sourceTxt, String targetTxt,

final String wordLibs) {





// String wordLibs =

// "c:\\wordFromInputmethod.txt,c:\\word.txt,c:\\ext.txt";

// String sourceTxt = "c:\\sincin.txt";

// String targetTxt = "c:\\fentsiOK.txt";

int n = 0;

List<String> li_r = new ArrayList<String>();





fileC0 fc = new fileC0();

// String text = fc.fileRead(sourceTxt);

// if(true)return;

List<String> lica7 = fc.fileRead2list(sourceTxt, "utf-8");

int mid = lica7.size() / 2;

final List<String> lica7_half1 = lica7.subList(0, mid);

List<String> lica7_half2 = lica7.subList(mid, lica7.size());





List<String> lica7_half2_result;

// n = fentsiMuilttheard(wordLibs, n, lica7);





new Thread(new Runnable() {

public void run() {





try {

fentsiOr ftc = new fentsiOr();

lica7_half1_result = ftc.fentsiMuilttheard(lica7_half1,

wordLibs, "thd1");

half1_isfinesh=true;





} catch (Exception e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName());





}

}).start();







//main thread

fentsiOr ftc = new fentsiOr();

lica7_half2_result = ftc.fentsiMuilttheard(lica7_half2, wordLibs,

"thd_main");








//stop whiel half is not ok

int nn = 0;

while (true) {

if (half1_isfinesh) {

break;

}

nn++;

try {

Thread.sleep(50);

System.out.println("--sleep 500 ,num:" + nn);

} catch (InterruptedException e) {





e.printStackTrace();

throw new RuntimeException(e);

}





}





List<String> li_all=new ArrayList<String>();

li_all.addAll(lica7_half1_result);

li_all.addAll(lica7_half2_result);

 fc.saveList2file(li_all, targetTxt, "utf-8");





}

















参考:

多核编程 与 单核多线程编程的区别 - 点滴记录 不断进步 - 博客频道 - CSDN.NET.htm

paip.提升性能--多核cpu中的java/.net/php/c++编程的更多相关文章

  1. paip.提升性能--多核编程中的java .net php c++最佳实践 v2.0 cah

    paip.提升性能--多核编程中的java .net php c++最佳实践  v2.0 cah 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax ...

  2. paip.提升性能---mysql 优化cpu多核以及lan性能的关系.

    paip.提升性能---mysql 优化cpu多核以及lan性能的关系. 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:/ ...

  3. paip.提升性能----java 无锁结构(CAS, Atomic, Threadlocal, volatile, 函数式编码, 不变对象)

    paip.提升性能----java 无锁结构(CAS, Atomic, Threadlocal, volatile, 函数式编码, 不变对象) 1     锁的缺点 2     CAS(Compare ...

  4. paip.提升性能---并行多核编程哈的数据结构list,set,map

    paip.提升性能---并行多核编程哈的数据结构list,set,map vector/copyonwritearraylist 都是线程安全的. 或者经过包装的list ::: collection ...

  5. paip.提升性能---jvm java 工具使用.

    paip.提升性能---jvm java 工具使用. 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...

  6. paip.提升性能---协程“微线程”的使用.

    paip.提升性能---协程的使用. 近乎无限并发的"微线程" 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:h ...

  7. paip. 提升性能---hibernate的缓存使用 总结

    paip. 提升性能---hibernate的缓存使用 总结 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog ...

  8. paip.提升性能----数据库连接池以及线程池以及对象池

    paip.提升性能----数据库连接池以及线程池以及对象池 目录:数据库连接池c3po,线程池ExecutorService:Jakartacommons-pool对象池 作者Attilax  艾龙, ...

  9. paip.提升性能3倍--使用栈跟VirtualAlloc代替堆的使用.

    paip.提升性能3倍--使用栈跟VirtualAlloc代替堆的使用. #----为什么要设计堆栈,它有什么独特的用途? 为了性能 ....  堆比栈的性能 也有的说法为了编程容易...这个是错误的 ...

随机推荐

  1. Java NIO 之缓冲区

    缓冲区基础 所有的缓冲区都具有四个属性来 供关于其所包含的数据元素的信息. capacity(容量):缓冲区能够容纳数据的最大值,创建缓冲区后不能改变. limit(上界):缓冲区的第一个不能被读或写 ...

  2. gulp-rev-orig

    给客户演示项目时,老是会出现由于缓存,造成的最新的样式或者效果出不来的情况,还得需要手动清除缓存操作,一方面呢,会给客户留下不好的印象,而且也会多了清缓存这一过程,和同事商量过后,决定使用在css或者 ...

  3. getline函数彻底说明

    因为之前每次使用这个函数都要在网上查一遍,觉得很麻烦,这次就认真地整理一下,希望写完之后就记住. getline函数其实有两个: 一个是全局函数,include<cstring>, 原型是 ...

  4. 关于ubuntu16.4 中安装最新的eclipse或者是STS出现页面特卡,且新建项目没有提示,preference选项中点击左侧标签右侧没反应的解决办法,参照google, 排版不太好,希望对一些小伙伴有所帮助

    up vote21down votefavorite 12 Eclipse was working as good as anything on 14.04. I did a clean instal ...

  5. 在c++这片神秘的大陆上

    在c++这片神秘的大陆上,有一个无往而不利的地下王国,据说其手段血腥残忍,却深得民心,因为,他们是侠,是剑胆琴心,诗肠酒骨的侠客,他们不知解决了多少疑难杂症,除去了多少问题漏洞,而他们的首领-> ...

  6. being词典案例分析

    一.调研评测: 1.软件bug: 1.输入空格分号回车之后并不给用户报错,说明他的异常处理机制有问题. 2.对于中文的很多口头语和方言,并不能给出翻译或者说,也并没有给出网络搜索后的结果. 3.添加生 ...

  7. Python学习之路-Day4

    1.函数 函数定义 def  func(aa):         def:表示函数的关键字  func:函数名,即函数的名称,可根据函数名调用函数 print('.....')        prin ...

  8. ubuntu网络配置&&ubuntu apt-get错误解决办法

    网络配置: 方式1:网卡通过DHCP自动获取IP地址 $ sudo gedit /etc/network/interfaces # 修改文件/etc/network/interfaces如下文 #-- ...

  9. mysql用户权限设置

    1.创建新用户 通过root用户登录之后创建 >> grant all privileges on *.* to testuser@localhost identified by &quo ...

  10. 1.webService入门

    学习webService前,先来思考一个问题: 请看以下截图: 以上是一个综合网站的部分显示信息,我们能很明显的看出打开该网页所处区域的一些信息,比如:地点是厦门,天气是阵雨,温度是9摄氏度等等... ...