Benchmark práce s objekty v jazycích C++, Vala a Python

Již delší dobu se chystám programovat v jazyku Vala. Jde o objektově orientovaný jazyk postavený nad GObject. Mima jiného mě zajímala i rychlost výsledného programu. Připravil sem tedy test, který porovnává rychlost práce s třídami a instancemi s ostatními jazyky, ve kterých programuji.
Kompilátor jazyka Vala sám nevytváří binární kód, ale vygeneruje kód v čistém C, který je kompilován běžným kompilátorem, typicky gcc. A protože je inspirován vysokoúrovňovými jazyky a orientován právě na GObject, je interní práce s objekty od ostatních jazyků odlišná. Objekty jsou udržovány v paměti obdobně jako v jazyku Python pomocí referencí. Počítají se tedy reference na objekt, a pokud jsou vynulovány, objekt je z paměti uvolněn.

Test spočívá v definici jednoduché třídy Foo, která má jeden parametr typu integer. Tato třída je následně milionkrát vytvořena, je vyčten její parametr (zavolána metoda instance) a následně zničena. Ještě než přijde řada na zdrojové kódy testů, rád bych uvedl, že jsem si vědom, že kód není nijak optimalizován na konkrétní jazyky a v řadě případů by šel jistě napsat daleko efektivněji. Účelem testu však bylo zjistit, jaké jsou nároky na CPU při běžném použití.

Následují jednotlivé zdrojové kódy, případně jejich variace a výsledný čas měřený nástrojem time. Čas byl měřen třikrát a v grafech jsou použity průměry naměřených hodnot.

C++

V případě C++ jsem do testu začlenil použití třídy (class) bez předka. Rozdíl v použití struktury (struct) je velmi malý a pro srovnání s jazykem Vala vlastně ne zcela vypovídající.
int count = 1000*1000;

class Foo {
private:
int i;

public:
Foo(int i){
this->i = i;
}
int geti(){
return this->i;
}
};

int main(int argv, char ** argc){
for (int i = 0; i < (count); i++){
Foo foo(i);
foo.geti();
}

return 0;
}
C++ class:                                  avg
real 0m0.038s 0m0.039s 0m0.027s 0m0.035s
user 0m0.040s 0m0.032s 0m0.028s 0m0.033s
sys 0m0.000s 0m0.000s 0m0.000s 0m0.000

A také dědění třídy Glib.Object z glibmm, což je c++ wrapper nad glib knihovnou. Rozdíl mezi glibmm a Valou je zejména v tom, že výsledný program nevyžaduje žádnou další knihovnu ke svému provozu.
#include <glibmm/object.h>
#include <glibmm/init.h>

int count = 1000*1000;

class Foo : public Glib::Object {
private:
int i;

public:
Foo(int i):Glib::Object(){
this->i = i;
}
int geti(){
return this->i;
}
};

int main(int argv, char ** argc){
Glib::init();

for (int i = 0; i < (count); i++){
Foo foo(i);
foo.geti();
}

return 0;
}
C++ GObject:                                avg
real 0m5.222s 0m5.308s 0m5.225s 0m5.252s
user 0m5.140s 0m5.176s 0m5.124s 0m5.174s
sys 0m0.004s 0m0.016s 0m0.012s 0m0.011s

Vala

Jazyk Vala může přistupovat k třídám různými způsoby. Nejpodobnější třídě tak jak ji známe z C++ je Struct, který je značně omezen v případě použití jako třídy, nicméně režie okolo vytváření a práce se strukturou se blíží režii v C++, což je dáno zejména tím, že se nepracuje s referencemi.
int count = 1000*1000;

struct Foo {
public int i;
public Foo.new(int i){
this.i = i;
}

public int geti(){
return this.i;
}
}

public int main(string[] args){
for (int i = 0; i < (count); i++){
Foo foo = Foo(){
i = i
};
foo.geti();
}

return 0;
}
Vala struct:                                avg
real 0m0.102s 0m0.102s 0m0.105s 0m0.103s
user 0m0.088s 0m0.096s 0m0.096s 0m0.093s
sys 0m0.008s 0m0.000s 0m0.004s 0m0.004s

Další možnost jak vytvořit odlehčenou třídu je použití direktivy [Compact].
int count = 1000*1000;

[Compact]
class Foo {
public int i;

public Foo(int i){
this.i = i;
}

public int geti(){
return this.i;
}
}

public int main(string[] args){
for (int i = 0; i < (count); i++){
Foo foo = new Foo(i);
foo.geti();
}

return 0;
}
Vala compat class:                          avg
real 0m0.393s 0m0.395s 0m0.399s 0m0.396s
user 0m0.388s 0m0.396s 0m0.392s 0m0.392s
sys 0m0.000s 0m0.004s 0m0.004s 0m0.003s

V jazyce Vala lze dále dělit třídy na ty které nejsou děděny z GLib.Object a ty které jsou. Tyto dvě skupiny budou nejčastěji používané a dva předchozí testy jsou malým porušením testu, neboť se snaží optimalizovat výsledný kód. Ty třídy které nejsou potomky GLib.Object mají o něco menší režii.
int count = 1000*1000;

class Foo {
private int i;

public Foo(int i){
this.i = i;
}

public int geti(){
return this.i;
}
}

public int main(string[] args){
for (int i = 0; i < (count); i++){
Foo foo = new Foo(i);
foo.geti();
}

return 0;
}
Vala class:                                 avg
real 0m2.712s 0m2.758s 0m2.404s 0m2.634s
user 0m2.620s 0m2.716s 0m2.372s 0m2.569s
sys 0m0.004s 0m0.012s 0m0.012s 0m0.009s

Na závěr tedy kód a čas v případě použití třídy, která je potomkem GLib.Object. Je asi vhodné dodat, že právě tyto třídy jsou v jazyce Vala preferované, což je vzhledem k nejčastějšímu použití jazyka pochopitelné.
int count = 1000*1000;

class Foo: GLib.Object {
private string name;
private int i;

public Foo(string name, int i){
this.name = name;
this.i = i;
}

public int geti(){
return this.i;
}
}

public int main(string[] args){
for (int i = 0; i < (count); i++){
Foo foo = new Foo("This is funcking foo", i);
foo.geti();
}

return 0;
}
Vala GObject:                               avg
real 0m6.042s 0m6.052s 0m6.142s 0m6.079s
user 0m5.956s 0m5.932s 0m6.040s 0m5.976s
sys 0m0.004s 0m0.012s 0m0.008s 0m0.008s

Python

Jak už bylo zmíněno, i Python používá ke správě objektů reference. A jelikož je Python jeden z mých hlavních programovacích jazyků, začlenil i jeho tři testy.

První test používá třídu bez předka. Jde o vlastně starý koncept tříd v Pythonu, který je udržován zejména kvůli zpětné kompatibilitě.
count = 1000*1000

class Foo:
def __init__(self, name, i):
self.name = name
self.i = i

def geti(self):
return self.i

for i in xrange(count):
foo = Foo("This is funcking foo", i)
foo.geti()
Python class:                               avg
real 0m6.052s 0m5.771s 0m6.066s 0m5.963s
user 0m5.888s 0m5.636s 0m5.912s 0m5.812s
sys 0m0.004s 0m0.020s 0m0.012s 0m0.012s

V druhém testu je použita třída object. Jde tedy o standardní způsob vytváření objektů. Takto vytvořené třídy a jejich instance mají některé další možnosti, a je to poznat i na režii CPU.
count = 1000*1000

class Foo(object):
def __init__(self, name, i):
self.name = name
self.i = i

def geti(self):
return self.i

for i in xrange(count):
foo = Foo("This is funcking foo", i)
foo.geti()
Python Object:                              avg
real 0m7.129s 0m7.611s 0m6.910s 0m6.883s
user 0m6.972s 0m6.484s 0m6.768s 0m6.741s
sys 0m0.020s 0m0.020s 0m0.028s 0m0.023s

Poslední test stejně jako v C++ nebo Vale používá třídu poděděnou z gobject.GObject. Zde už režie cpu dosahovala poněkud extrémních hodnot.
import gobject

count = 1000*1000

class Foo(gobject.GObject):
def __init__(self, name, i):
gobject.GObject.__init__(self)
self.name = name
self.i = i

def geti(self):
return self.i

for i in xrange(count):
#glib.init()

foo = Foo("This is funcking foo", i)
foo.geti()
Pthon GObject:                              avg
real 0m39.760s 0m39.194s 0m39.332s 0m39.760s
user 0m38.990s 0m38.518s 0m38.658s 0m38.772s
sys 0m0.032s 0m0.020s 0m0.040s 0m0.031s

Grafy


Obr1: Použití základních tříd jazyka.


Obr2: Použití tříd odvozených od GObject implementace v daném jazyku.

Pár slov na závěr

Z uvedených výsledků je zřejmé, že si jazyk Vala nestojí zase až tak špatně. Nicméně vzhledem k tomu, že jde o jazyk určený zejména k tvorbě grafických programů, je škoda, že chybí srovnání s jazyky C# (Mono) a Java. Stejně tak zde chybí test GObjectu v čistém C, který je značněji komplikovanější na použití, bylo by však vidět jak moc si člověk pohorší s výkonem výsledné aplikace.

Výsledný program nebyl nijak optimalizován, to znamená že kompilace probíhala bez dalších parametrů. Stejně tak sem si vědom, že jednotlivé jazyky používají různé vlastní optimalizace a ty, i když nejsou předmětem testu ovlivňují výsledky. A v konečné fázi si rozhodně nemyslím, že typická aplikace vytváří a následně ničí milion objektů. Na druhou stranu rozsáhlá aplikace může takových objektů mít opravdu mnoho, což je ale zcela jiná kapitola.

Jednoznačnou výhodu Valy proti C++ s glibmm vidím zejména v novém přístupu k programování. Jde o jiný jazyk, podobný spíše vysokoúrovňovým jazykům, který je ale šitý na míru GObjectu, tedy GTK+ knihovně. Výsledný kód je ale kompilovaný do binární podoby externím programátorem, a tak nejsou zapotřebí žádné další knihovny, což je vidět i na velikostech výsledných binárek.

Autor:

Diskuze

Дизайн интерьера - советы, часть 539
Паркетная химия / Средства для очистки и ухода продуктами Loba

Средства для очистки и ухода продуктами Loba

Идеальный комплект для очистки и ухода за покрытыми лаком полами. Комплект поставляется в удобной и привлекательной картонной упаковке, которая является превосходной "визитной карточкой" LOBА. Комплект состоит из 1л средства LOBA® ParketCare (LOBACARE FloorPolishPlus) и 1л средства LOBA® Cleaner (LOBACARE Neutralreiniger).

Идеальный комплект для очистки и ухода за обработанными маслом /воском полами полами. Комплект поставляется в удобной и привлекательной картонной упаковке, которая является превосходной "визитной карточкой" LOBА. Комплект состоит из 1л средства LOBA® ParkettWax (LOBACARE PolishWax) и 1л средства LOBA® WaxCleaner (LOBACARE Solana)

Идеальное средство по уходу за паркетом в частном жилом секторе.

Водное средство по уходу, которое подходит для напольных покрытий практически всех видов. ParkettCare (FloorPolishPlus) отличается необыкновенно высокой схватывающей способностью, что особенно важно при уходе за проблемными поверхностями, такими как лаки с добавками против царапин (Antiscratch).

Преимущества: простота в применении; после нанесения ParkettCare (FloorPolishPlus) поверхность становится глянцевой, на ней не остается следов полос от обуви и т. п. Рекомендуется для ухода за всеми видами покрытого лаком паркета, напольных покрытий из пробки и паркетной доски, а также для ухода за эластичными напольными покрытиями и покрытиями из камня во внутренних помещениях.

Лучшее средство по уходу за паркетом с матовой поверхностью.

Для тех, кто предпочитает матовую поверхность глянцевой. Водное, специальное средство по уходу за всеми видами напольных покрытий, на которые нанесен матовый лак. После использования LOBA® FloorCare (LOBACARE® MattPolish) поверхность становится равномерно матовой, не требует полировки, на ней не остается следов полос от обуви и т. п.

LOBA® FloorCare (LOBACARE® MattPolish) можно использовать для нанесения на поверхности, покрытые лаками с различной степенью матовости. Рекомендуется для ухода за всеми видами покрытого матовым лаком паркета, напольных покрытий из пробки и паркетной доски, а также для ухода за эластичными напольными покрытиями и покрытиями из камня во внутренних помещениях.

Вид матовый

Фасовка 5,0л 1,0л

Сильный и в то же время щадящий концентрат для очистки с приятным свежим запахом. Предназначен для многоцелевого использования в сочетании с линией продуктов по уходу LOBACARE®. Хорошо удаляет жир и грязь, придает напольным покрытиям чистоту и свежесть. Рекомендуется для очистки всех видов паркета, напольных покрытий из пробки и паркетной доски, а также эластичных напольных покрытий и покрытий из камня.

Средство для генеральной очистки сильно загрязненных покрытий и удаления старых слоев водных средств по уходу. В сильно разбавленном виде может также использоваться для текущей очистки. Средство является pH-нейтральным и поэтому идеально подходит для очистки чувствительных покрытий. Рекомендуется для всех видов покрытого лаком паркета, напольных покрытий из пробки и паркетной доски, а также для генеральной очистки эластичных напольных покрытий и покрытий из камня во внутренних помещениях.

Фасовка 10,0л 1,0л

Высококачественное жидкое средство по уходу на основе воска. Идеально подходит для первичного ухода. LOBA® ParkettWax (LOBACARE® PolishWax) закрывает открытые поры и тем самым защищает покрытие от загрязнений. Наряду с этим средство придает поверхности покрытия блеск и предохраняет его от проникновения влаги.

Рекомендуется для покрытых маслом и/или воском паркета, напольных покрытий из древесины и пробки, а также для покрытий из линолеума.

Водный концентрат идеально подходит для текущей очистки и ухода. LOBA® Wax Cleaner (LOBACARE® SOLANA) является pH-нейтральным средством и поэтому может использоваться для ухода и очистки чувствительных покрытий. Слой средства по уходу придает поверхности покрытия шелковистый блеск и препятствует скольжению. Рекомендуется для покрытых маслом и/или воском паркета, напольных покрытий из древесины и пробки.

Простое в применении масляное средство по уходу на основе натуральных растительных масел и воска. Наносится на обработанные маслом покрытия, придает поверхности матовый цвет и не требует полировки. С помощью данного средства можно осуществлять текущий уход за отдельными участками напольного покрытия. При нанесении LOBA® Parkett Oil (LOBACARE® OilBalsam) на всю поверхность с покрытия удаляются следы от каблуков обуви и другие сильные загрязнения, а также устраняются легкие повреждения в основном слое масла. Рекомендуется для ухода за покрытыми маслом паркетом и напольными покрытиями из древесины и пробки.

Фасовка 1,0л

Специальное, содержащее растворители средство для генеральной очистки со слабым запахом. Быстро и качественно удаляет сильные загрязнения, следы от каблуков обуви и старые слои воска. Рекомендуется для устойчивых к воздействию растворителей паркета, напольных покрытий из древесины и пробки, а также покрытий из линолеума и ПВХ.

Фасовка 12,0л 1,0л

Специальное водное средство по уходу за покрытым лаком паркетом и напольными покрытиями из древесины. Соответствует требованиями стандарта DIN18032 к коэффициенту противоскольжения. Придает поверхности паркета блеск без полировки. Рекомендуется для ухода за напольными покрытиями в помещениях, где предъявляются особенно высокие требования к коэффициенту противоскольжения поверхности: спортивных залах, развлекательных комплексах, общественных учреждениях, танцевальных залах.

Универсальное водное средство по уходу практически для всех видов напольных покрытий. Отличается высокой устойчивостью к воздействию бытовых химикатов и средств дезинфекции.

Преимущества: придает покрытию блеск и препятствует появлению полос и следов обуви на его поверхности. Рекомендуется для покрытых лаком паркета и напольных покрытий из пробки, а также для эластичных покрытий и покрытий из камня во внутренних помещениях.

Водное защитное средство длительного действия на основе модифицированных полиуретанов. Образует высокоэластичную защитную пленку, устойчивую к экстремально высоким нагрузкам. LOBACARE® V6 Finish можно удалить с поверхности только механическим способом, поэтому и наносить это средство следует при помощи специальных приспособлений. Рекомендуется для покрытых лаком паркета и напольных покрытий из пробки, а также для эластичных покрытий в помещениях с экстремально высокими нагрузками: магазинах, супермаркетах и т. п.

Специальное водное средство по уходу за покрытыми лаком пробковыми полами.

LOBACARE® Korkpflege образует прочную, эластичную защитную пленку, которая не смазывается и придает поверхности шелковистый блеск и грязеотталкивающие свойства.

Экологичное водное универсальное средство по уходу на основе растительного воска.

Воск для натирки полов, произведенный на основе натурального сырья

Фасовка 1,0л

Преимущества: простое и удобное в использования: распылить и протереть

Фасовка 1,0л

Водное концентрированное средство для текущей очистки и ухода за ламинатом.

LOBACARE® LaminatCleaner является pH-нейтральным и после высыхания не оставляет полос на поверхности покрытия. Оптимальное средство для покрытий из ламината.

Служит для защиты стыков паркетной доски от влаги и улучшает сцепление при нанесении дополнительных слоев лака на пробковые покрытия.

Universalreiniger

Cредтво для очистки инструмента

Фасовка 5,0 л

Концентрат для очистки всех водостойких напольных покрытий, гладких и лакированных поверхностей.

Преимущества: универсальный в применении, не оставляет полос при высыхании.

Станция метро "Сокол"

ул. Балтийская, д.5, торговый комплекс "Домострой", пав.3-2

пн-суб.- с 11.00 - 19.00

воск. с 11.00 - 18.00

О компании | Каталог | Фотогалерея | Полезная информация | Проекты | Контакты

© 2011 OAO "Стелла Дизайн"

паркет, ламинат, керамическая плитка, керамогранит

Источник: http://remontkvartir63.tk/ - http://remontkvartir63.tk/
Váš komentář:

© 2023 Ondřej Tůma McBig. Ondřej Tůma | Based on: Morias | Twitter: mcbig_cz | RSS: články, twitter