perl java_与Perl相比Java性能问题

我已经编写了一个Perl代码来处理大量CSV文件并获取输出,这需要0.8326秒才能完成.

my $opname = $ARGV[0];

my @files = `find . -name "*${opname}*.csv";mtime -10 -type f`;

my %hash;

foreach my $file (@files) {

chomp $file;

my $time = $file;

$time =~ s/.*\~(.*?)\..*/$1/;

open(IN, $file) or print "Can't open $file\n";

while () {

my $line = $_;

chomp $line;

my $severity = (split(",", $line))[6];

next if $severity =~ m/NORMAL/i;

$hash{$time}{$severity}++;

}

close(IN);

}

foreach my $time (sort {$b <=> $a} keys %hash) {

foreach my $severity ( keys %{$hash{$time}} ) {

print $time . ',' . $severity . ',' . $hash{$time}{$severity} . "\n";

}

}

现在,我用Java编写了相同的逻辑,但我花了2600毫秒(即2.6秒)来完成.我的问题是Java为什么要花这么长时间?如何达到与Perl相同的速度?

注意:我忽略了VM初始化和类加载时间.

import java.io.BufferedReader;

import java.io.File;

import java.io.FileFilter;

import java.io.FileReader;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import java.util.TreeMap;

public class MonitoringFileReader {

static Map> store= new TreeMap>();

static String opname;

public static void testRead(String filepath) throws IOException

{

File file = new File(filepath);

FileFilter fileFilter= new FileFilter() {

@Override

public boolean accept(File pathname) {

// TODO Auto-generated method stub

int timediffinhr=(int) ((System.currentTimeMillis()-pathname.lastModified())/86400000);

if(timediffinhr<10 && pathname.getName().endsWith(".csv")&& pathname.getName().contains(opname)){

return true;

}

else

return false;

}

};

File[] listoffiles= file.listFiles(fileFilter);

long time= System.currentTimeMillis();

for(File mf:listoffiles){

String timestamp=mf.getName().split("~")[5].replace(".csv", "");

BufferedReader br= new BufferedReader(new FileReader(mf),1024*500);

String line;

Map tmp=store.containsKey(timestamp)?store.get(timestamp):new HashMap();

while((line=br.readLine())!=null)

{

String severity=line.split(",")[6];

if(!severity.equals("NORMAL"))

{

tmp.put(severity, tmp.containsKey(severity)?tmp.get(severity)+1:1);

}

}

store.put(timestamp, tmp);

}

time=System.currentTimeMillis()-time;

System.out.println(time+"ms");

System.out.println(store);

}

public static void main(String[] args) throws IOException

{

opname = args[0];

long time= System.currentTimeMillis();

testRead("./SMF/data/analyser/archive");

time=System.currentTimeMillis()-time;

System.out.println(time+"ms");

}

}

文件输入格式(A?B?C?D?E?20150715080000.csv),每个文件约500个,每个文件约1MB,

A,B,C,D,E,F,CRITICAL,G

A,B,C,D,E,F,NORMAL,G

A,B,C,D,E,F,INFO,G

A,B,C,D,E,F,MEDIUM,G

A,B,C,D,E,F,CRITICAL,G

Java版本:1.7

Update //

根据以下评论,

我用regex替换了split,性能得到了很大的改善.

现在,我正在循环执行此操作,经过3-10次迭代后,性能还是可以接受的.

import java.io.BufferedReader;

import java.io.File;

import java.io.FileFilter;

import java.io.FileReader;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class MonitoringFileReader {

static Map> store= new HashMap>();

static String opname="Etis_Egypt";

static Pattern pattern1=Pattern.compile("(\\d+\\.)");

static Pattern pattern2=Pattern.compile("(?:\"([^\"]*)\"|([^,]*))(?:[,])");

static long currentsystime=System.currentTimeMillis();

public static void testRead(String filepath) throws IOException

{

File file = new File(filepath);

FileFilter fileFilter= new FileFilter() {

@Override

public boolean accept(File pathname) {

// TODO Auto-generated method stub

int timediffinhr=(int) ((currentsystime-pathname.lastModified())/86400000);

if(timediffinhr<10 && pathname.getName().endsWith(".csv")&& pathname.getName().contains(opname)){

return true;

}

else

return false;

}

};

File[] listoffiles= file.listFiles(fileFilter);

long time= System.currentTimeMillis();

for(File mf:listoffiles){

Matcher matcher=pattern1.matcher(mf.getName());

matcher.find();

//String timestamp=mf.getName().split("~")[5].replace(".csv", "");

String timestamp=matcher.group();

BufferedReader br= new BufferedReader(new FileReader(mf));

String line;

Map tmp=store.containsKey(timestamp)?store.get(timestamp):new HashMap();

while((line=br.readLine())!=null)

{

matcher=pattern2.matcher(line);

matcher.find();matcher.find();matcher.find();matcher.find();matcher.find();matcher.find();matcher.find();

//String severity=line.split(",")[6];

String severity=matcher.group();

if(!severity.equals("NORMAL"))

{

tmp.put(severity, tmp.containsKey(severity)?tmp.get(severity)+1:1);

}

}

br.close();

store.put(timestamp, tmp);

}

time=System.currentTimeMillis()-time;

//System.out.println(time+"ms");

//System.out.println(store);

}

public static void main(String[] args) throws IOException

{

//opname = args[0];

for(int i=0;i<20;i++){

long time= System.currentTimeMillis();

testRead("./SMF/data/analyser/archive");

time=System.currentTimeMillis()-time;

System.out.println("Time taken for "+i+" is "+time+"ms");

}

}

}

但是我现在还有一个问题,

在小型数据集上运行时查看结果.

**Time taken for 0 is 218ms

Time taken for 1 is 134ms

Time taken for 2 is 127ms**

Time taken for 3 is 98ms

Time taken for 4 is 90ms

Time taken for 5 is 77ms

Time taken for 6 is 71ms

Time taken for 7 is 72ms

Time taken for 8 is 62ms

Time taken for 9 is 57ms

Time taken for 10 is 53ms

Time taken for 11 is 58ms

Time taken for 12 is 59ms

Time taken for 13 is 46ms

Time taken for 14 is 44ms

Time taken for 15 is 45ms

Time taken for 16 is 53ms

Time taken for 17 is 45ms

Time taken for 18 is 61ms

Time taken for 19 is 42ms

首先,花费的时间更多,然后减少.

为什么???

谢谢 ,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

controller调用另一个controller中的方法 获取返回值_必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?...

Spring中涉及的设计模式总结&#xff0c;在面试中也会经常问道 Spring 中设计模式的问题。本文以实现方式、实质、实现原理的结构简单介绍 Sping 中应用的 9 种设计模型&#xff0c;具体详细的刨析会在后面的文章发布&#xff0c;话不多说&#xff0c;来个转发、在看、收藏三连…

我个人的CRUD故事-或我如何来到CUBA平台

在此博客文章中&#xff0c;我想介绍一下我如何使用CUBA平台以及此工具的好处。 在我年轻的“业务应用程序开发”历史上&#xff0c;我将深入探讨不同的阶段&#xff0c;只为您提供一些背景知识。 因此&#xff0c;让我们从如何进入典型的CRUD应用程序开始&#xff0c;以帮助非…

MySQL分库分表环境下全局ID生成方案

转自&#xff1a;https://my.oschina.net/u/142836/blog/174465 在大型互联网应用中&#xff0c;随着用户数的增加&#xff0c;为了提高应用的性能&#xff0c;我们经常需要对数据库进行分库分表操作。在单表时代&#xff0c;我们可以完全依赖于数据库的自增ID来唯一标识一个用…

java 不定参数方法_java中不定长参数的使用方法

java中不定长参数的使用方法不定长参数方法的语法如下&#xff1a;返回值 方法名(参数类型...参数名称)在参数列表中使用“...”形式定义不定长参数&#xff0c;其实这个不定长参数a就是一个数组&#xff0c;编译器会将(int...a)这种形式看作是(int[] a)的形式。示例&#xff1…

光盘刻录只允许读取不能拷贝_原来 8 张图,就可以搞懂「零拷贝」了

作者 | 小林coding来源 | 小林coding(ID&#xff1a;CodingLin)前言磁盘可以说是计算机系统最慢的硬件之一&#xff0c;读写速度相差内存 10 倍以上&#xff0c;所以针对优化磁盘的技术非常的多&#xff0c;比如零拷贝、直接 I/O、异步 I/O 等等&#xff0c;这些优化的目的就是…

如何:带有Thymeleaf和Spring Boot的Java 8日期和时间

如果您碰巧使用Spring Boot和Thymeleaf&#xff0c;并且需要在视图中格式化Java 8 Date&#xff06;Time对象&#xff0c;则可以使用thymeleaf-extras-java8time –用于Java 8 Date&#xff06;Time API的Thymeleaf模块。 向现有的基于Maven或Gradle的Spring Boot项目中添加th…

纯java分布式内存数据库_最新Java岗面试清单:分布式+Dubbo+线程+Redis+数据库+JVM+并发...

最近可能有点闲的慌&#xff0c;没事就去找面试面经&#xff0c;整理了一波面试题。我大概是分成了Java基础、中级、高级&#xff0c;分布式&#xff0c;Spring架构&#xff0c;多线程&#xff0c;网络&#xff0c;MySQL&#xff0c;Redis缓存&#xff0c;JVM相关&#xff0c;调…

c++ 多核cpu序列号_详解CPU几个重点基础知识

作者 | 骏马金龙责编 | 阿秃关于CPU和程序的执行1、程序的运行过程&#xff0c;实际上是程序涉及到的、未涉及到的一大堆的指令的执行过程。当程序要执行的部分被装载到内存后&#xff0c;CPU要从内存中取出指令&#xff0c;然后指令解码(以便知道类型和操作数&#xff0c;简单…

5.8上午

数学分册基础概念 转载于:https://www.cnblogs.com/yanyuying/p/6828791.html

java log4j 写日志_Java log4j同时写入文本日志和数据库日志

版权声明&#xff1a;转载原创文章请以超链接形式请注明原文章出处&#xff0c;尊重作者&#xff0c;尊重原创&#xff01;恰饭广告Log4jUtil.javaimport org.apache.log4j.Logger;import org.apache.log4j.MDC;public class Log4jUtil {private static Logger logger Logger.…

订单生产计划表范本_工厂生产管理为什么需要ERP软件?

对于工厂来说&#xff0c;规模大了&#xff0c;管理问题也就随之多了&#xff0c;在工厂生产流程中&#xff0c;我们常见的一些生产现象&#xff0c;比如生产计划表徒具形式、各生产部门半成品堆积、生产计划达标率低、前后工序原材料或半成品衔接不上、经常追加或取消生产计划…

codeforces 701 E. Connecting Universities(树+ 边的贡献)

题目链接&#xff1a;http://codeforces.com/contest/701/problem/E 题意&#xff1a;有n个城市构成一棵树&#xff0c;一个城市最多有一个学校&#xff0c;这n个城市一共2*k个学校&#xff0c;要对这2*k个学校进行连边&#xff0c;使得所有连出来的边的和最大&#xff0c;每条…

拜托,Java。 最终是否支持多行字符串文字

我了解Java语言的思想很难以向后兼容的方式进行维护。 我知道JDK API&#xff08;例如集合&#xff09;的想法很难打破。 是。 我不明白为什么Java 仍然没有多行字符串文字。 您多久编写一次这样的JDBC代码&#xff08;或您想嵌入Java的任何其他外部语言或标记&#xff0c;例…

java memorystream 包_MemoryStream

MemoryStream位于System.IO命名空间&#xff0c;为系统内存提供流式的读写操作。常作为其他流数据交换时的中间对象操作。1、MemoryStream类封装一个字节数组&#xff0c;在构造实例时可以使用一个字节数组作为参数&#xff0c;但是数组的长度无法调整。使用默认无参数构造函数…

网站pc端分享QQ好友,空间,微博

在开发pc端网站的过程中&#xff0c;涉及到邀请好友的功能&#xff0c;之前单纯的复制粘贴已经无法满足用户的体验。故&#xff0c;仿照移动端添加自动分享到QQ好友&#xff0c;QQ空间&#xff0c;QQ微博的功能。 分享到QQ好友&#xff1a;http://connect.qq.com/widget/shareq…

python如果选择不在列表里_Python-list.remove(x)x不在列表中

我正在尝试在Python 3.3中创建一个简单的程序,该程序采用四个名称的列表,并将它们随机分配给列表中的另一个人.例如,如果名称是John,Aaron,Lydia和Robin&#xff1a; 约翰先走,然后选择一个名字.他不能画自己的东西.如果他这样做,他会把它放回去并再次抽签.说约翰画了罗宾的名字…

P1266 速度限制

速度限制 洛谷链接 题目大意&#xff1a; 在一个城市中&#xff0c;每条道路有限速和长度&#xff0c;通过一条道路的时间为这条道路的长度除以限制的速度&#xff0c;有的道路不知道限速为多少&#xff0c;那么就按现在的速度走这条路&#xff0c;找出从第一个点到目标点的最短…

dbunit测试dao_用于数据库测试的DBUnit,Spring和注释

dbunit测试dao如果您曾经尝试用Java编写数据库测试&#xff0c;则可能会遇到DBUnit 。 DBUnit允许您设置和拆除数据库&#xff0c;以便它包含可针对其编写测试的一致行。 通常&#xff0c;您可以通过编写一个简单的XML文档来指定要DBUnit插入的行&#xff0c;例如&#xff1a; …

python自动化之正则

import re phoneNumRegexre.compile(r\d\d\d-\d\d\d-\d\d\d\d) mophoneNumRegex.search(My number is 415-555-4242.) print(Phone number found: mo.group()) #######利用括号分组############## phoneNumRegexre.compile(r(\d\d\d)-(\d\d\d-\d\d\d\d)) mophoneNumRegex.searc…

mysql递归查询所有上下节点_非递归打印二叉树的所有路径,保存父节点和孩子节点到底有啥差别...

题目解读题目要求输出二叉树的所有路径(字符串形式)&#xff0c;乍一看很简单&#xff0c;不就是二叉树的遍历嘛&#xff01;其实不然&#xff0c;首先&#xff0c;我们用非递归的方式(C)解决这道题(递归在产品代码中是不允许使用的&#xff0c;其次定位 bug 的时候非常困难)。…