На конференции Microsoft BUILD Херб Саттер объяснил, что С++ имеет "Real Arrays", а языки С#/Java не имеют одинакового или своего рода.
Я был продан по этому поводу. Вы можете посмотреть полный разговор здесь http://channel9.msdn.com/Events/Build/2014/2-661
Вот быстрый снимок слайда, где он описал это. http://i.stack.imgur.com/DQaiF.png
Но я хотел посмотреть, сколько разницы я сделаю.
Итак, я написал очень наивные программы для тестирования, которые создают большой вектор строк из файла с строками от 5 символов до 50 символов.
Ссылка на файл:
www (dot) dropbox.com/s/evxn9iq3fu8qwss/result.txt
Затем я обратился к ним последовательно.
Я сделал это упражнение как на С#, так и на С++.
Примечание. Я внесла некоторые изменения, удалив копирование в циклы, как было предложено. Спасибо, что помогли мне понять реальные массивы.
В С# я использовал List и ArrayList, потому что ArrayList устарел в пользу списка.
Вот результаты на моем ноутбуке Dell с процессором Core i7:
count C# (List<string>) C# (ArrayList) C++
1000 24 ms 21 ms 7 ms
10000 214 ms 213 ms 64 ms
100000 2 sec 123 ms 2 sec 125 ms 678 ms
Код С#:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace CSConsole
{
class Program
{
static void Main(string[] args)
{
int count;
bool success = int.TryParse(args[0], out count);
var watch = new Stopwatch();
System.IO.StreamReader isrc = new System.IO.StreamReader("result.txt");
ArrayList list = new ArrayList();
while (!isrc.EndOfStream)
{
list.Add(isrc.ReadLine());
}
double k = 0;
watch.Start();
for (int i = 0; i < count; i++)
{
ArrayList temp = new ArrayList();
for (int j = 0; j < list.Count; j++)
{
// temp.Add(list[j]);
k++;
}
}
watch.Stop();
TimeSpan ts = watch.Elapsed;
//Console.WriteLine(ts.ToString());
Console.WriteLine("Hours: {0} Miniutes: {1} Seconds: {2} Milliseconds: {3}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
Console.WriteLine(k);
isrc.Close();
}
}
}
Код С++
#include "stdafx.h"
#include <stdio.h>
#include <tchar.h>
#include <vector>
#include <fstream>
#include <chrono>
#include <iostream>
#include <string>
using namespace std;
std::chrono::high_resolution_clock::time_point time_now()
{
return std::chrono::high_resolution_clock::now();
}
float time_elapsed(std::chrono::high_resolution_clock::time_point const & start)
{
return std::chrono::duration_cast<std::chrono::milliseconds>(time_now() - start).count();
//return std::chrono::duration_cast<std::chrono::duration<float>>(time_now() - start).count();
}
int _tmain(int argc, _TCHAR* argv [])
{
int count = _wtoi(argv[1]);
vector<string> vs;
fstream fs("result.txt", fstream::in);
if (!fs) return -1;
char* buffer = new char[1024];
while (!fs.eof())
{
fs.getline(buffer, 1024);
vs.push_back(string(buffer, fs.gcount()));
}
double k = 0;
auto const start = time_now();
for (int i = 0; i < count; i++)
{
vector<string> vs2;
vector<string>::const_iterator iter;
for (iter = vs.begin(); iter != vs.end(); iter++)
{
//vs2.push_back(*iter);
k++;
}
}
auto const elapsed = time_elapsed(start);
cout << elapsed << endl;
cout << k;
fs.close();
return 0;
}