String Matlab:在最后一个字符段拆分字符串的最快方法
我必须用Matlab编写一个程序,性能非常重要,因为它处理了很多文件 我必须找到文件名的最后一个文件扩展名并将其拆分 e、 g.String Matlab:在最后一个字符段拆分字符串的最快方法,string,performance,matlab,String,Performance,Matlab,我必须用Matlab编写一个程序,性能非常重要,因为它处理了很多文件 我必须找到文件名的最后一个文件扩展名并将其拆分 e、 g.file.name.tar.gz应分为file.name.tar和gz 我确定了3种方法来实现这一点,但我不知道哪种方法最快 一, 二, 三, 我认为第三个是最糟糕的。但是其他的方法呢? 你能想出比我描述的方法更快的方法吗 您可以通过执行以下操作来测试: tic; fileName = 'testFileName.ext'; for i=1:100000 <f
file.name.tar.gz
应分为file.name.tar
和gz
我确定了3种方法来实现这一点,但我不知道哪种方法最快
一,
二,
三,
我认为第三个是最糟糕的。但是其他的方法呢?
你能想出比我描述的方法更快的方法吗 您可以通过执行以下操作来测试:
tic;
fileName = 'testFileName.ext';
for i=1:100000
<find last dot>
end
toc;
我得到的时间是:
Java解决方案:23秒
findstr解决方案:0.4秒
strtok解决方案:(没有终止;可能是我复制错了)
反向循环解决方案:0.01秒
与findstr和strtok相比,我的解决方案的优势在于:
a) 它只查找一个点,而不是所有点
b) 它从字符串的末尾开始(可能大多数文件扩展名的长度都是2-4个字母)。您可以通过执行以下操作来测试这些扩展名:
tic;
fileName = 'testFileName.ext';
for i=1:100000
<find last dot>
end
toc;
我得到的时间是:
Java解决方案:23秒
findstr解决方案:0.4秒
strtok解决方案:(没有终止;可能是我复制错了)
反向循环解决方案:0.01秒
与findstr和strtok相比,我的解决方案的优势在于:
a) 它只查找一个点,而不是所有点
b) 它从字符串的末尾开始(大概大多数文件扩展名都是2-4个字母长)。内置命令
fileparts
可以满足您的需要,但可能需要大量开销/错误检查等,这可能不是必需的。如果你看100左右的线,是的
ind = find(name == '.', 1, 'last');
ext = name(ind:end);
name(ind:end) = [];
其中,
name
是输入文件名。这与您的第二个建议非常相似-可能会快一点或慢一点,我还没有完成计时。内置命令fileparts
可以满足您的需要,但可能需要大量开销/错误检查等,这可能不是必需的。如果你看100左右的线,是的
ind = find(name == '.', 1, 'last');
ext = name(ind:end);
name(ind:end) = [];
其中,
name
是输入文件名。这与你的第二个建议非常相似——可能快一点,也可能慢一点,我没有计时。而不是lastDot=dots(length(dots))代码>您可以使用lastDot=dots(结束)代码>您有数百个文件名要处理,所以即使是这些解决方案中速度最慢的也需要什么?比最快的方法多处理一毫秒?在我看来,这似乎是一个愚蠢的优化。正如您在Richantes的答案中所看到的,最慢的方法所花费的时间大约是最快的方法的2300倍,因此它是有意义的代码>您可以使用lastDot=dots(结束)代码>您有数百个文件名要处理,所以即使是这些解决方案中速度最慢的也需要什么?比最快的方法多处理一毫秒?对我来说,这似乎是一个愚蠢的优化。正如你在Richantes的回答中所看到的,最慢的方法需要的时间是最快的方法的2300倍,因此它是有意义的。感谢基准测试技术,我不知道tic和toc。此外,您的解决方案是最快的。在strtok解决方案中,我有一个错误。在第3行中,它应该是[temp2 tempExt]=strtok(tempExt,'.')代码>。感谢您的基准测试技术,我不知道tic和toc。此外,您的解决方案是最快的。在strtok解决方案中,我有一个错误。在第3行中,它应该是[temp2 tempExt]=strtok(tempExt,'.')代码>。
for index=length(fileName):-1:1
if (fileName(index) == '.')
break;
end
end
ind = find(name == '.', 1, 'last');
ext = name(ind:end);
name(ind:end) = [];