Как технарю из России стать программером в США за 150К

ddv
Уже с Приветом
Posts: 481
Joined: 04 Jul 2005 17:07
Location: Москва->Staten Island NY

Re: Как технарю из России стать программером в США за 150К

Post by ddv »

Zombie416 wrote:Вообще-то CLR байт-код компилируется в нативный код перед исполнением. И при аналогичном качестве оптимизатора (сравнивая MS VC++ и MS VC++/CLR), скорость исполнения практически идентична, как ни удивительно (правда так было не всегда).
Вы действительно не понимаете разницу между оптимизатором Native кода при компиляции, и тем что CLR компилятор оптимизирует BYTE CODE, а не Native!!!! А у JIT компилятора просто нет необходимой информации для нормальной оптимизации. Кроме того, CLR делает слишком много ненужных действий, которые не уберет ни один оптимизатор.

Zombie416 wrote: Повторюсь, преимущества C#/Java начинают проявляться не в программе hello world, а когда есть множество библиотек и интерфейсов, которые надо собирать в кучу.
Библиотек для C++ на порядок больше. Единственное приимущество .NET - RAD среда разработки...Без нее C# в GUI был бы бесполезен.
ddv
Уже с Приветом
Posts: 481
Joined: 04 Jul 2005 17:07
Location: Москва->Staten Island NY

Re: Как технарю из России стать программером в США за 150К

Post by ddv »

Zombie416 wrote:
ddv wrote:STL на C# совпадающий построчно???? Пример использования std::vector,std::list,std::map на C# в студию :D . В месте с benchmark..
List<T>, LinkedList<T>, Dictionary<T> . Бенчмарки идентичные практически, я проверял, и вы тоже можете.
Это уже даже не смешно...У вас совпадают построчно это когда совпадает количество строчек????
Zombie416
Уже с Приветом
Posts: 8881
Joined: 17 Jun 2003 04:41

Re: Как технарю из России стать программером в США за 150К

Post by Zombie416 »

ddv wrote:Это уже даже не смешно...У вас совпадают построчно это когда совпадает количество строчек????
Я не старался вас повеселить, уж извините. Конечно это не смешно. Это работает.

"Совпадают построчно", да, когда примерно совпадает количество строчек, как и свойства объектов, и глядя на измения в коде на C++ очевидно где, что и на что править в C# коде, и наоборот. К сожалению, хороших автоматических средств для подобного не существует.

А необходимость в подобной логике имеется. К примеру, если вам нужна идентичная поддержка довольно сложных двоичных структур данных (архив, к примеру), как cross-platform C++, так и Silverlight.
Zombie416
Уже с Приветом
Posts: 8881
Joined: 17 Jun 2003 04:41

Re: Как технарю из России стать программером в США за 150К

Post by Zombie416 »

ddv wrote:Вы действительно не понимаете разницу между оптимизатором Native кода при компиляции, и тем что CLR компилятор оптимизирует BYTE CODE, а не Native!!!! А у JIT компилятора просто нет необходимой информации для нормальной оптимизации. Кроме того, CLR делает слишком много ненужных действий, которые не уберет ни один оптимизатор.
"Вы действительно не понимаете" о чем говорите, но это пройдет.

Бла-бла это здорово, но вы попробуйте. Вот прямо своими руками. Могут быть очень интересные сюпризы. У меня были.
Библиотек для C++ на порядок больше. Единственное приимущество .NET - RAD среда разработки...Без нее C# в GUI был бы бесполезен.
Ну да, ну да... GUI - дело десятое (хотя Visual Studio штука хорошая, безусловно). Преимущество .NET/Java именно в легкости интеграции разных модулей, написанных разными людьми, в разное время, в том числе на разных языках, в кучу.
User avatar
Boriskin
Уже с Приветом
Posts: 18906
Joined: 30 Aug 2001 09:01
Location: 3rd planet

Re: Как технарю из России стать программером в США за 150К

Post by Boriskin »

Очередной holy-war, гы!

Мне лично по барабану, на чем писать - С/С++/Java/ObjС, за бабки я только на С# не писал, и, походу, врядли буду (в силу многих причин). По моим субъективным ощущениям, за плюсы платят больше; студентов оным сейчас особо не учат; индусы в оные тоже не рвутся; большого и сложного легаси кода на них - до жопы... Так что по совокупности перечесленного - я свои личные перспективы рассматриваю весьма положительно. На тему грыдушего замещения плюсов жабой, шарпом, и прочими ХеЗ языками - уж сколько лет замещают (10 - 20), да никак заместить не могут. "Нехай брешут" (с)
Тупизна как Энтропия. Неумолимо растет.
ddv
Уже с Приветом
Posts: 481
Joined: 04 Jul 2005 17:07
Location: Москва->Staten Island NY

Re: Как технарю из России стать программером в США за 150К

Post by ddv »

Zombie416 wrote:Бла-бла это здорово, но вы попробуйте. Вот прямо своими руками. Могут быть очень интересные сюпризы. У меня были.
Ну попробовал...Сделал 2 консольные програмки на C++ и C#

Code: Select all

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <list>


int _tmain(int argc, _TCHAR* argv[])
{
	std::list<int>  list;
	timeBeginPeriod(1);
	DWORD time_start = timeGetTime();
	for (int i = 0; i < 1000; i++)
		for (int j = 0; j < 1000; j++)
			list.push_back(i + j);

	for (int i = 0; i < 1000; i++)
		for (int j = 0; j < 1000; j++)
			list.pop_front();

	DWORD time_end = timeGetTime();
	std::cout << "Time elapsed " << (time_end - time_start) << std::endl;
	timeEndPeriod(1);
	return 0;
}

Code: Select all

using System;
using System.Collections.Generic;
using System.Text;

namespace test_clr
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Int32> list = new List<Int32>();
            int time_start = Environment.TickCount;
            for (int i = 0; i < 1000; i++)
                for (int j = 0; j < 1000; j++)
                    list.Add(i + j);

            for (int i = 0; i < 1000; i++)
                for (int j = 0; j < 1000; j++)
                        list.RemoveAt(0);

            int time_end = Environment.TickCount;
            Console.WriteLine("Time elapsed " + (time_end - time_start));
        }
    }
}
Так вот...CLR код работает около 164 секунд. А C++ вариант работает 60 МИЛЛИСЕКУНД!!! Это в 2733 раза быстрее!
Только запускать надо не из под отладчика, а из консоли. Под отладчиком C++ вариант работат 40 секунд (что все равно в 4 раза быстрее CLR), потому что отладчик ему мешает.
Zombie416
Уже с Приветом
Posts: 8881
Joined: 17 Jun 2003 04:41

Re: Как технарю из России стать программером в США за 150К

Post by Zombie416 »

ddv wrote:Так вот...CLR код работает около 164 секунд. А C++ вариант работает 60 МИЛЛИСЕКУНД!!! Это в 2733 раза быстрее!
Какой интересный тест... Вот о подобных выводах и речь. И ведь даже не удивились почему-то.

Начать можно с того что List<T> ~ std::vector<T>, и естессно удаление первого элемента массива в миллион элеметов с копированием всех остальных будет ээ... несколько помедленнее. Ну примерно в тысячи раз. Закончить тем, что выяснить где там CLR overhead, где реализация конкретной коллекции и ее стратегии выделения памяти, где C# vs C++ оптимизатор. Часть можно выяснить откомпилировав с С++/CLR .

А там уже и выводы какие-то делать. А потом можно и еще какой-нить более практический тест сделать.
Last edited by Zombie416 on 11 Feb 2011 18:15, edited 1 time in total.
ddv
Уже с Приветом
Posts: 481
Joined: 04 Jul 2005 17:07
Location: Москва->Staten Island NY

Re: Как технарю из России стать программером в США за 150К

Post by ddv »

Zombie416 wrote:Какой интересный тест... Вот о подобных выводах и речь. И ведь даже не удивились почему-то.Начать можно с того что List<T> ~ std::vector<T>
Нет...у std::vector нету pop_front()...Кроме того std::vector БЫСТРЕЕ std::list, и если заменить на std::vector и pop_back() то работать будет не 60, а 5 мс.
Zombie416 wrote: А там уже и выводы какие-то делать. А потом можно и еще какой-нить более практический тест сделать.
Нет уж теперь не отрекайтесь...сначала вы пишете то что у вас на C# аналогичный STL код работает так же быстро, а когда я вам доказал что он работает в 2733 раз медленнее, то вы сразу запели песню, что если использовать в несколько сот раз меньше элементов, то на глаз это не заметно. НЕВАЖНО сколько элементов...он все равно работает в 2733 раз медленнее...и не важно что с 10 элементами на глаз это не заметно.
Zombie416
Уже с Приветом
Posts: 8881
Joined: 17 Jun 2003 04:41

Re: Как технарю из России стать программером в США за 150К

Post by Zombie416 »

ddv wrote:Нет...у std::vector нету pop_front()...Кроме того std::vector БЫСТРЕЕ std::list, и если заменить на std::vector и pop_back() то работать будет не 60, а 5 мс.
Бугага. Ну вы попробуйте если это неочевидно так. Hint: у std::vector есть vector.erase(vector.begin()). Делает примерно то что list.RemoveAt(0).

А аналог std::list называется LinkedList<T>.
Нет уж теперь не отрекайтесь...сначала вы пишете то что у вас на C# аналогичный STL код работает так же быстро, а когда я вам доказал что он работает в 2733 раз медленнее, то вы сразу запели песню, что если использовать в несколько сот раз меньше элементов, то на глаз это не заметно. НЕВАЖНО сколько элементов...он все равно работает в 2733 раз медленнее...и не важно что с 10 элементами на глаз это не заметно.
Вы почитайте что я написал еще раз. На код свой посмотрите. И начнете удивляться КАК можно получить 2733 раза на таком коде, и нет ли тут каких других объяснений кроме в тысячи раз overhead-а CLR :)

Бенчмарк напишите нормальный. Тестирующий разное. Не double-linked список целых чисел (такое ни на C++, ни на .NET не бывает, и да на .NET будет медленнее из-за unboxing, но не в 2733 раза).
ddv
Уже с Приветом
Posts: 481
Joined: 04 Jul 2005 17:07
Location: Москва->Staten Island NY

Re: Как технарю из России стать программером в США за 150К

Post by ddv »

Zombie416 wrote:Бугага. Ну вы попробуйте если это неочевидно так. Hint: у std::vector есть vector.erase(vector.begin()). Делает примерно то что list.RemoveAt(0)
Вот об этом я и говорю...вы даже не понимаете в чем разница vector.erase(vector.begin()) и pop_front() в list и почему этого метода НЕТ у vector...А его нет потому что vector не предназначен для использования как связанный список с произвольным удалением элементов. Вам не приходило в голову, что vector это аналог массивов в CLR и удаление любого элемента кроме последнего приводит к необходимости КОПИРОВАНИЯ ВСЕХ оставшихся за ним элементов.

Теперь я понимаю почему у вас С++ работает с тойже скоростью что и C#.
Zombie416
Уже с Приветом
Posts: 8881
Joined: 17 Jun 2003 04:41

Re: Как технарю из России стать программером в США за 150К

Post by Zombie416 »

ddv wrote:Теперь я понимаю почему у вас С++ работает с тойже скоростью что и C#.
Потому что я понимаю чем std::vector отличается от std::list, а List<T> от LinkedList<T>, что они представляют из себя внутри, и т.д.

А вы - нет, даже после объяснений и совершенно невероятных результатов собственного кривого тестирования. Как грится, что и требовалось доказать. Язык ничто, человек - все.
zzhou
Уже с Приветом
Posts: 567
Joined: 06 Dec 2009 20:50
Location: Kiev, UA -> Cupertino, CA

Re: Как технарю из России стать программером в США за 150К

Post by zzhou »

Brazen wrote:
zzhou wrote:Ни разу за 10+ лет не приходилось такое делать. Но вот как надо извращатся в С чтобы XML разобрать или до БД добраться - это я видел.
Потому C он такой и компактный, что все фичи в библиотеках.
Правильно. В разных библиотеках разной степени кривизны. Но настоящие Сишники всё равно будут руками с нуля писать - чтобы не мучатся с чужими багами.

Аналог Hibernate на С++ насколько зрелый есть? Или какой-нибуть JSF.

XML и БД на C# и Яве - часть основной библиотеки. Без них не бывает.
nightmare2
Уже с Приветом
Posts: 7187
Joined: 31 Jan 2005 15:06
Location: GA

Re: Как технарю из России стать программером в США за 150К

Post by nightmare2 »

ddv wrote:
Zombie416 wrote:Бла-бла это здорово, но вы попробуйте. Вот прямо своими руками. Могут быть очень интересные сюпризы. У меня были.
Ну попробовал...Сделал 2 консольные програмки на C++ и C#

Code: Select all

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <list>


int _tmain(int argc, _TCHAR* argv[])
{
	std::list<int>  list;
	timeBeginPeriod(1);
	DWORD time_start = timeGetTime();
	for (int i = 0; i < 1000; i++)
		for (int j = 0; j < 1000; j++)
			list.push_back(i + j);

	for (int i = 0; i < 1000; i++)
		for (int j = 0; j < 1000; j++)
			list.pop_front();

	DWORD time_end = timeGetTime();
	std::cout << "Time elapsed " << (time_end - time_start) << std::endl;
	timeEndPeriod(1);
	return 0;
}

Code: Select all

using System;
using System.Collections.Generic;
using System.Text;

namespace test_clr
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Int32> list = new List<Int32>();
            int time_start = Environment.TickCount;
            for (int i = 0; i < 1000; i++)
                for (int j = 0; j < 1000; j++)
                    list.Add(i + j);

            for (int i = 0; i < 1000; i++)
                for (int j = 0; j < 1000; j++)
                        list.RemoveAt(0);

            int time_end = Environment.TickCount;
            Console.WriteLine("Time elapsed " + (time_end - time_start));
        }
    }
}
Так вот...CLR код работает около 164 секунд. А C++ вариант работает 60 МИЛЛИСЕКУНД!!! Это в 2733 раза быстрее!
Только запускать надо не из под отладчика, а из консоли. Под отладчиком C++ вариант работат 40 секунд (что все равно в 4 раза быстрее CLR), потому что отладчик ему мешает.
Попробуйте вот этот код.
У меня работает очень быстро.

Code: Select all

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{
	class Program
	{
		static void Main(string[] args)
		{
			LinkedList<int> list = new LinkedList<int>();
		
			int time_start = Environment.TickCount;
			for (int i = 0; i < 1000; i++)
				for (int j = 0; j < 1000; j++)
					list.AddLast(i + j);
			
			for (int i = 0; i < 1000; i++)
				for (int j = 0; j < 1000; j++) {
					list.RemoveFirst();
				}

			int time_end = Environment.TickCount;
			Console.WriteLine("Time elapsed {0}", (time_end - time_start));

			Console.ReadLine(); 
		}
	}
}
.NET библиотека очень богатая, чего тут только нет. :-)
Vaiyo A-O, A Home Va Ya Ray, Vaiyo A-Rah, Jerhume Brunnen G!
ddv
Уже с Приветом
Posts: 481
Joined: 04 Jul 2005 17:07
Location: Москва->Staten Island NY

Re: Как технарю из России стать программером в США за 150К

Post by ddv »

Zombie416 wrote:А аналог std::list называется LinkedList<T>.
Вот с этого и надо было начинать...не все же знают что массив можно обозвать списком. Да ...теперь разница меньше - 2.5 раза...но и это далеко от одинаковой производительности...и даже от 50%-100% озвученных вами.
nightmare2
Уже с Приветом
Posts: 7187
Joined: 31 Jan 2005 15:06
Location: GA

Re: Как технарю из России стать программером в США за 150К

Post by nightmare2 »

ddv wrote:
Zombie416 wrote:А аналог std::list называется LinkedList<T>.
Вот с этого и надо было начинать...не все же знают что массив можно обозвать списком. Да ...теперь разница меньше - 2.5 раза...но и это далеко от одинаковой производительности...и даже от 50%-100% озвученных вами.
Согласитесь, что это критично только для очень узкого круга задач.
Зато C# могут выучить все, а C++ только особо одаренные.
Программистов надо много, на всех спец мозгов не хватает.
Это как коробка автомат, для гонок не подходит, но до места довезет с комфортом. :-)
Vaiyo A-O, A Home Va Ya Ray, Vaiyo A-Rah, Jerhume Brunnen G!

Return to “Работа и Карьера в IT”