日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

perl java_与Perl相比Java性能问题

發布時間:2023/12/2 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

首先,花費的時間更多,然后減少.

為什么???

謝謝 ,

總結

以上是生活随笔為你收集整理的perl java_与Perl相比Java性能问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。