Сценарий оболочки для синхронизации моей программы измеряет его в 0 секунд - PullRequest
1 голос
/ 14 октября 2008

Мой профессор написал этот скрипт для определения времени моей программы и отображения результатов. По какой-то причине он просто выводит 0 с моей программой. Он предоставил следующие файлы:

timeit.csh
sequence
ecoli2500.txt   
ecoli3000.txt    
ecoli5000.txt    
ecoli7000.txt    
ecoli8000.txt    
ecoli9000.txt    
ecoli10000.txt

Вот содержимое последовательности

java EditDistance

Содержимое файла timeit.csh находится ниже.

Java EditDistance

На самом деле программа работает безупречно с каждым из указанных выше файлов, кроме последовательности.

Я не понимаю, почему

./timeit.csh sequence

выдает все нули

Вот timeit.csh ... (далее - EditDistance.java):

#!/bin/csh
# 
# A Unix script to time programs.
#
# Command line: timeit sequence


# the array of programs from the commandline
set program = $argv[1]

# adjust as needed
set CPULIMIT = 120
limit cpu $CPULIMIT seconds
limit core 0

# input files
set input = ( stx1230.txt      \
    ecoli2500.txt    \
    ecoli3000.txt    \
    ecoli5000.txt    \
    ecoli7000.txt    \
    ecoli8000.txt    \
    ecoli9000.txt    \
    ecoli10000.txt)

# adjust as needed
set inputpath = `pwd`

# print header
printf "CPU limit = %d seconds\n\n" $CPULIMIT
printf "%-25s" "Data File"
foreach program ($argv)
printf "%16s" $program
end
printf "\n"

# print right number of = for table
@ i = 25 + 16 * $#argv 
while ($i > 0)
printf "="
@ i = $i - 1
end
printf "\n"


# time it and print out row for each data file and  column for each program
foreach datafile ($input)
printf "%-25s" $datafile
if (-f $inputpath/$datafile) then
    foreach program ($argv)
    # printing running time of program on datafile
    # -p flag with time to ensure its output is measured in seconds and not minutes
    nice /usr/bin/time -p $program <                    \
        $inputpath/$datafile |&                        \
        egrep '^user[ ]*[0-9]' |                       \
        awk '{ if ($2 >= '$CPULIMIT') printf "       CPU limit"; else printf("%16.2f", $2) }'
    # egrep, awk commands extract second column of row corresponding to user time

    end
else printf "could not open" $datafile
endif
printf "\n"

end

Вот EditDistance.java

import java.util.*;

class EditDistance {
    public static int min(int a, int b, int c) {
        return Math.min(a,Math.min(b,c));
    }
    public static int distance(String one, String two) {
        if (one.length()>two.length()) {
            String temp1 = one;
            String temp2 = two;
            one = temp2;
            two = temp1;
        }
        int[][] d = new int[one.length()+1][two.length()+1];
        d[0][0] = 0;
        int top, left, topleft, cost;
        for (int i = 1; i <= one.length(); i++) {
            d[0][i] = 2*i;
            d[i][0] = 2*i;
        }
        for (int i = 1; i <= one.length(); i++) {
            for (int j = 1; j <= two.length(); j++) {

                if (one.charAt(i-1) == two.charAt(j-1))
                    cost = 0;
                else
                    cost = 1;

                top = d[i][j-1];
                left = d[i-1][j];
                topleft = d[i-1][j-1];
                d[i][j] = min(top+2,left+2,topleft+cost);
            }
        }
        return d[one.length()][two.length()];
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String one = scanner.next();
        String two = scanner.next();
        System.out.println(distance(one,two));
    }
}

Есть идеи, почему вещи не работают? Я не знаю много о сценариях оболочки, но этот раздел сценария оболочки:

nice /usr/bin/time -p $program <                    \
    $inputpath/$datafile |&                        \
    egrep '^user[ ]*[0-9]' |                       \
    awk '{ if ($2 >= '$CPULIMIT') printf "       CPU limit"; else printf("%16.2f", $2) }'

подтверждает, что моя программа должна ожидать эту команду:

java EditDistance < ecoli2500.txt
java EditDistance...etc. etc. 

но программа работает с этими командами. Мне нужно настроить мою программу так, чтобы она правильно реагировала на сценарий оболочки. Может быть, некоторые из вас могут помочь.

Ответы [ 2 ]

1 голос
/ 15 октября 2008

Fixed. Проблема была здесь:

 nice /usr/bin/time -p $program < 

в сценарии. Мой компьютер не выполняет сценарии оболочки без "./" перед командой. Мой профессорский компьютер должен быть другим. Меняем скрипт на

nice /usr/bin/time -p ./$program <

Отлично запустил программу.

Я точно знаю, что я и мой профессор используем Fedora 8. Какая разница, которая позволит мне запускать программы в терминале, просто набрав их имя?

0 голосов
/ 14 октября 2008

Я не уверен, каково состояние среды (например, PATH) или состояние файлов и разрешений, но это может быть так же просто, как проблема с разрешениями сценария оболочки последовательности (который, я думаю, вы ' Сказанное содержит «Java EditDistance»). Если вы 'chmod + x sequence', это работает? Другая проблема заключается в том, что он может не совпадать с вашим путем, вы можете запустить последовательность, набрав: './sequence

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...