Моделирование “более быстрого времени” в Linux

Язык на самом деле не определяет, как должна осуществляться базовая реализация. Это оставлено на усмотрение поставщика компилятора. Я сомневаюсь, что они используют структуру или запись. Любой ответ, который вы найдете, будет зависеть от поставщика, а не от языка. Стоит отметить, что наиболее распространенный компилятор, GNAT, является открытым исходным кодом, поэтому исходный код доступен для просмотра и попытки разобраться, как они это делают. Опять же, это только одна потенциальная реализация. Другие компиляторы могут делать это по-другому.

Если вы просто имеете в виду, как может выглядеть пример пакета:

empty my_package.ads:

package My_Package is
    -- Empty package
end My_Package;

my_package.ads с типом типа «класс»:

package My_Package is

   type My_Type is tagged private;

   function Get_Value(Self : My_Type) return Integer;

private

   type My_Type is tagged record
      Value : Integer := 2;
   end record;

end My_Package;

my_package.adb с определениями операций:

package body My_Package is

   function Get_Value(Self : My_Type) return Integer is
   begin
      return Self.Value;
   end Get_Value;

end My_Package;

Как видите, пакеты могут быть пустым Они могут иметь типы, операции или оба. Пакеты - это место, где обрабатывается инкапсуляция (в отличие от типа, подобного C ++ и Java). Таким образом, вы можете иметь частные типы и операции в пакете, но не заниматься традиционным объектно-ориентированным программированием.

11
задан patros 8 March 2009 в 22:34
поделиться

4 ответа

Можно записать интерфейс обертки для вызовов времени/даты. Имейте одну реальную реализацию, которая делает реальные системные вызовы и тестовую реализацию, которая может сделать то, что Вы хотите (выполненный быстрее, медленнее, поддельные даты, и т.д.).

9
ответ дан 3 December 2019 в 06:48
поделиться

Если Вы - системные вызовы для получения системного времени (т.е. System.currentTimeMillis()), по-видимому, можно ускорить время путем изменения системного времени. Это должно размышлять над временем, которое Вы видите в своем приложении.

Если Вы используете другие способы вычислить время (прошедшее время от JVM запускаются (т.е. System.nanoTime()), сетевые серверы времени, и т.д....) затем ответ - то, что это не возможно.


Я не могу подчеркнуть достаточно, что я просто объясняю, как сделать то, что Вы спросили, и это хорошо только для интеграционного тестирования, когда Вы принимаете во внимание что-либо еще, на что Вы влияете на упомянутой машине.

Это не должно стать заменой вообще для надлежащего и обширного поблочного тестирования.

2
ответ дан 3 December 2019 в 06:48
поделиться

Один подход, который работает лучше всего на поблочное тестирование, должен абстрагировать способ, которым к текущему времени получают доступ в Вашем коде.

Вместо того, чтобы назвать System.currentTimeMillis () непосредственно можно обеспечить собственную реализацию.

Что-то вроде этого (псевдокод):

class MyTime {
   private static TimeInterface CurrentTimeInterface = new DefaultTimeImpl();

   public setTimeInterface(TimeInterface timeInterface) {
      CurrentTimeInterface = timeInterface;
   }

   public int getTime() { CurrentTimeInterface.getTime(); }

}

class DefaultTimeImpl implements TimeInterface {
   public int getTime() { return System.currentTimeMillis(); }
}

class TestTimeImpl implements TimeInterface {
   private int CurrentTimeMillis = 0;
   public int getTime() { return CurrentTimeMillis; }
   public void setTime(int timeMillis) { CurrentTimeMillis = timeMillis}
   public void sleep(int millis) { CurrentTimeMillis += millis; }
}

Затем везде Вы звонили бы, System.getTimeMillis () вместо этого называют MyTime.getTime (). Когда Вы тестируете свой код, просто создают TestTimeImpl и называют MyTime.setTimeInterface(testTimeImpl). Затем, когда Вы хотите время к предварительному вызову testTimeImpl.sleep () или testTimeImpl.setTime ().

Это позволяет Вам моделировать любое время вниз к миллисекунде.

7
ответ дан 3 December 2019 в 06:48
поделиться

Необходимо разработать систему так, чтобы можно было 'перенести' часы во время тестирования. Для некоторых классов системы существует очередь событий, которая хранит запланированные события в порядке времени. В любой точке на моделировании следующее событие является первым объектом в очереди; можно вытянуть его от очереди и скорректировать полезное время так, чтобы это соответствовало времени, когда то событие имеет место. Поскольку новые события планируются, они добавляются к очереди. Таким образом можно обработать события так быстро, как система позволяет, вместо того, чтобы иметь необходимость ожидать в течение фактического времени для протекания. Но необходимо разработать систему, чтобы позволить такому механизму работать.

0
ответ дан 3 December 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: