之前组里人写了个解密工具,用cmd调用jar包里的方法
@echo off
echo %time%
echo.
set key=8076yda4404ysh09
for /f %%i in (str.txt) do java -jar encrypt.jar aescbc d %%i %key%
echo.
echo %time%
pause
echo %time%为后期加上为了统计时间的,可以看到的是依次读取str.txt的内容,并解密,实测了一下,解密8k条数据需要花费50多分钟,那时间会是耗在哪儿呢?如果要修改应该怎么修改呢?
修改为直接在java中读取文件并一次性解密,代码如下:
public class DecryptMain
{
static List<String> originalList = new ArrayList<String>(1024);
static List<String> resultList = new ArrayList<String>(1024);
/**
* 读取文件保存到list
*/
static void readOriginalFile()
{
try
{
originalList = Files.readAllLines(Paths.get("str.txt"));
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
* 解密后写入list然后写入文件
*
* @param list 原始list
* @param encryptKey key
*/
static void decrypt(List<String> list, String encryptKey)
{
list.forEach(str ->
{
try
{
resultList.add(AESCBCEncrypter.getInstance().decrypt(str, encryptKey));
}
catch (EncryptException e)
{
e.printStackTrace();
}
});
}
/**
* 将结果List写入文件
*/
private static void writeResult()
{
try
{
Files.write(Paths.get("result.txt"), resultList, StandardOpenOption.CREATE);
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
String key = "8076yda4404ysh09";
if (args.length > 0)
{
key = args[0];
}
readOriginalFile();
decrypt(originalList, key);
writeResult();
}
}
工程pom.xml如下
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>decrypt</groupId>
<artifactId>decrypt</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>music-encrypt</groupId>
<artifactId>music-encrypt</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>${exec.mainClass}</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archiverConfig>
<encoding>utf-8</encoding>
</archiverConfig>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<exec.mainClass>decrypt.DecryptMain</exec.mainClass>
</properties>
</project>
其中依赖的包通过如下命令安装到本地
mvn install:install-file -D file=src\main\resources\encrypt.jar -D groupId=music-encrypt -D artifactId=music-encrypt -D version=1.0.0 -D packaging=jar -D generatePom=true
最后
mvn assembly:assembly
生成可执行jar包,修改bat文件为:
@echo off
echo %time%
echo.
set key=8076yda4404ysh09
java -jar decrypt.jar %key%
echo.
echo %time%
pause
实测600多毫秒即可完成,实际测试了一下,发现解密一条数据的耗时在200-300ms,java -jar命令一次耗时在100多ms,所以之前每一次单独解密8k条数据的耗时在8000*(100+300)=53分钟;加载后一起解密8k条数据的耗时在500ms,加上java -jar一次100ms,所以修改后可以600ms搞定,相当于提升了5000多倍,吹牛都不敢这样吹的一个提升效率比,说明选对方式很重要啊。小工具内部使用,一来,之前没有解密这么数据的需求;二来,之前的jar包是别的部门给的jar包,没有源码,做工具的同事也没想到mvn install到本地,在打包进咱自己包,同时修改可执行jar包的main类吧。