最近我開始接受AP計算機科學。我正在研究一個需要兩個聲音文件並覆蓋它們的項目。該項目本身並不是很難,我已經完成了,但我不確定我的代碼效率低下,還是隻處理大量任務。當我測試代碼時,我使用了兩個尺寸爲390KB和1.9MB的小型.wav文件。它和他們一起工作得很好。現在我試圖覆蓋大小爲25.8MB和30.6MB的文件。 BlueJ遇到內存錯誤,所以我增加了內存分配。不過,我覺得我的代碼有問題,而且運行效率低下。所以告訴我,我的代碼是否承擔了一項大型任務,或者是否有一種方法(使用提供的課程以及擁有大約2周計算機科學課程和一些非正式背景的學生的知識)來提高代碼的效率?是我的代碼無用還是隻是大任務?
這裏是我的代碼:
import sounds.*;
import sounds.Sample;
import java.util.Scanner;
import java.io.*;
public class Overlay
{
public static void main(String [] args) throws IOException
{
APSoundClip clip1 = new APSoundClip("Mitch_Murder_-_Guile_39_s_Theme.wav");
APSoundClip clip2 = new APSoundClip("Darude_-_Sandstorm_80s_Version.wav");
APSoundClip greaterClip;
APSoundClip lesserClip;
if (clip1.getLength() > clip2.getLength())
{
greaterClip = clip1;
lesserClip = clip2;
}
else
{
greaterClip = clip2;
lesserClip = clip1;
}
APSoundClip clipNew = new APSoundClip(greaterClip.getLength());
Sample sampleCombo = new Sample();
System.out.println(greaterClip.getLength());
for (int i = 0; i < greaterClip.getLength() - 1; i++)
{
int val1;
int val2;
Sample sample1 = greaterClip.getSample(i);
val1 = sample1.getValue();
if (i < lesserClip.getLength())
{
Sample sample2 = lesserClip.getSample(i);
val2 = sample2.getValue();
}
else
{
val2 = 0;
}
sampleCombo.setValue(val1 + val2);
clipNew.setSample(i, sampleCombo);
}
clipNew.draw();
clipNew.play();
}
}
我不認爲你的代碼是低效的,但我注意到你正在使用更大的剪輯的一個值,因爲你的計數器'i'從'0'變爲'length-2',而不是到'長度 - 1'。 –
我猜測代碼中內存密集的部分超出了您向我們展示的內容,可能是您正在使用的庫函數之一。您應該使用像[Oracle Mission Control](http://www.javacodegeeks.com/2015/03/oracle-java-mission-control-the-ultimate-guide.html)這樣的分析工具,它可以幫助您找到確切的自動瓶頸。 –
你把內存限制增加到了什麼程度?大概確實需要比這兩個文件稍大一些。 – immibis