Зависит от того, что Вы делаете. Если Вы хотите иметь размеры, стена показывают время (количество фактического времени, который протек), Вы не можете стать намного лучше. Если Вы хотите иметь размеры, сколько времени компьютер делал что-то тогда, что Вы могли бы хотеть посмотреть times
функция или time
команда. Эти times
функция в Perl возвращает список текущего накопленного времени для этого процесса в Вашем коде и коде любых модулей, которые Вы используете, этот процесс в системных вызовах, всех детях этого процесса в пользовательском коде и всех детях этого процесса в системных вызовах.
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes;
my $start_time = [Time::HiRes::gettimeofday()];
.
.
.
my ($user, $system, $child_user, $child_system) = times;
print "wall clock time was ", Time::HiRes::tv_interval($start_time), "\n",
"user time for $ was $user\n",
"system time for $ was $system\n",
"user time for all children was $child_user\n",
"system time for all children was $child_system\n";
Эти time
команда в UNIX подобна в функции. Вы выполняете команду как это
time ./script.pl
, и она производит что-то вроде этого
real 0m0.692s
user 0m0.019s
sys 0m0.109s
, где реальный стена, показывают время и пользователя, и sys совпадают с пользователем и системой выше.
Эти time
команда легче для человека использовать, но эти times
функция дает Вам больше информации и легче вписаться в компьютерную программу (плюс он, обладает преимуществом приведения к результатам, в то время как программа все еще работает).
, О, я забыл упоминать $^T
. Эта переменная содержит время начала программы в секундах с эпохи, поэтому если Вы только заботитесь о гранулярности секунд, можно просто сказать
END { print "The program ran for ", time() - $^T, " seconds\n" }
близость верхняя часть программы.
Пример из msdn
public struct Complex
{
double re, im;
public override bool Equals(Object obj)
{
return obj is Complex && this == (Complex)obj;
}
public override int GetHashCode()
{
return re.GetHashCode() ^ im.GetHashCode();
}
public static bool operator ==(Complex x, Complex y)
{
return x.re == y.re && x.im == y.im;
}
public static bool operator !=(Complex x, Complex y)
{
return !(x == y);
}
}
Вы также должны реализовать IEquatable
ОБЯЗАТЕЛЬНО реализуйте IEquatable для типов значений. Метод Object.Equals для типов значений вызывает бокс, и его реализация по умолчанию не очень эффективна, потому что в ней используется отражение. IEquatable.Equals может предложить гораздо лучшую производительность и может быть реализовано так, что это не вызывает бокса.
public struct Int32 : IEquatable<Int32> {
public bool Equals(Int32 other){ ... }
}
НЕОБХОДИМО следовать тем же правилам, что и для переопределение Object.Equals, когда реализация IEquatable.Equals. См. Подробности в разделе 8.7.1. рекомендации по переопределению Object.Equals
Основное различие между ними состоит в том, что оператор ==
является статическим, т. Е. соответствующий метод для вызова определяется во время компиляции, а метод Equals
вызывается динамически для экземпляра.
Возможно, лучше всего определить и то, и другое, даже если в случае структур это не так важно, поскольку структуры не могут быть расширены (структура не может наследовать от другой).