2012-05-14 47 views
0

我必須在Matlab中編寫一個程序,因爲它處理大量文件,所以性能非常重要。Matlab:在最後一個字符處分割字符串的最快方法

我必須找到文件名的最後一個文件擴展名並將其分割。

例如file.name.tar.gz應分爲file.name.targz

我確定了3種方法來做到這一點,但我不知道哪個是最快的。

1.

javaFilename = java.lang.String(fileName); 
lastDot = javaFilename.lastIndexOf('.'); 
name = char(javaFilename.substring(0, lastDot-1));  
ext = char(javaFilename.substring(lastDot+1)); 

2.

dots = findstr(fileName, '.'); 
lastDot = dots(length(dots)); 
name = fileName(1:lastDot-1); 
ext = fileName(lastDot+1:end);  

3.

[name tempExt] = strtok(fileName, '.'); 
while tempExt 
    [temp2 tempExt] = strtok(fileName, '.'); 
    if tempExt 
     name = strcat(name, '.', temp2); 
    end 
end 
ext = temp2(2:end); 

我覺得第三個是最差的。但其他方法呢? 你能想出比我描述的方法更快的任何東西嗎?

+1

而不是 'lastDot = dots(length(dots));''您可以使用'lastDot = dots(end);' –

+0

您有數百個文件名需要處理,所以即使這些解決方案中速度最慢的解決方案也需要什麼?比最快的方法還要多一毫秒?這對我來說似乎是一個愚蠢的優化。 – 2012-05-14 09:30:42

+0

正如你在Richantes的回答中看到的那樣,最慢的方法最多花費的時間是最快的2300倍,因此它是有意義的。 –

回答

2

你可以做類似測試這些:

tic; 
fileName = 'testFileName.ext'; 
for i=1:100000 
    <find last dot> 
end 
toc; 

我你的基準測試,發現第二個是快得多。

我的解決辦法是

for index=length(fileName):-1:1 
    if (fileName(index) == '.') 
    break; 
    end 
end 

我是時代:

Java解決方案:23秒

FINDSTR解決方案:0.4秒

strtok的解決方案:(沒終止;也許我錯了)

反向for-lo運算解決方案:0.01秒

我的解決方案在FINDSTR和strtok的的優點是: 一)只需找一個點,而不是所有的人都 二)從字符串的結尾開始(大概是最文件擴展名將會長2-4個字母)。

+0

感謝標杆技術,不知道tic和toc。你的解決方案也是最快的。在strtok解決方案中,我有一個錯誤。在第3行中它應該是'[temp2 tempExt] = strtok(tempExt,'。');'。 –

1

內置命令fileparts可以滿足您的需求,但可能需要大量的開銷/錯誤檢查等等,這可能不是必需的。如果你看看行約100,但它確實

ind = find(name == '.', 1, 'last'); 

ext = name(ind:end); 
name(ind:end) = []; 

其中name是輸入文件名。這與您的第二個建議非常相似 - 可能會更快或更慢,但我沒有完成時間安排。

相關問題