Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
if(IsNullOrWhiteSpace(arg))
После прочтения пришло осознание, чтоif(String.IsNullOrWhiteSpace(arg))
гораздо читабельнее.if (is_null_or_white_space(arg))
C# нам говорит: программируйте в удовольствие, у меня для этого всё есть: замечательные правила языка, правила именования, а также разные полезные библиотеки.
вы не можете никак взять и объявить поле, скажем, size size или point pointМожем (небольшое пояснение), но не стоит так делать. Да, сработает не всегда, но это не «никак».
#include <iostream>
#define profit int main(int argc, char *argv[]) {std::cout << "MACROS MASTER!!!"; return 0; }
profit
Выделение памяти (new/malloc) жутко тормозит! Вы сами, сами! должны делать управлятель памятью (ничего себе задача!), либо довольствоваться медленной работой
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PerfomanceTests {
public class PerfomanceTest {
public delegate void PerfomanceTestAction();
String title;
PerfomanceTestAction action;
int count;
public PerfomanceTest(String title, PerfomanceTestAction action, int count) {
this.action = action;
this.count = count;
this.title = title;
}
public long MeasurePerfomance() {
Stopwatch watch = new Stopwatch();
watch.Start();
int i = 0;
LABEL:
action();
i++;
if(i < count) goto LABEL;
watch.Stop();
return watch.ElapsedMilliseconds;
}
public void Run() {
WriteLine("Perfomance of "+title +": " + MeasurePerfomance()+" ms");
}
}
class Program {
class T {
byte c;
}
static void Main(string[] args) {
new PerfomanceTest("MAlloc", PFMAlloc, 10000000).Run();
Console.WriteLine("End!");
Console.ReadLine();
}
static byte[] x;
static void PFMAlloc() {
x = new byte[100];
//new T();
}
}
}
#include <iostream>
#include <string.h>
#include <random>
#include <time.h>
#include <string>
#include <sstream>
void TestPF(void func(), size_t count) {
size_t i = 0;
clock();
int time0 = clock();
while(i < count) {
func();
i++;
};
int time = clock()-time0;
printf( "Time=" );
printf( "%i\n", time );
};
void PFMAlloc() {
malloc(100);
}
int main() {
TestPF(PFMAlloc, 10000000);
return 0;
}
То же самое можете сделать и в C++: выделите сразу всю память, а потом делайте placement new.
В С++ такое как раз сплошь и рядом. Если что-то можно посчитать во время компиляции, многие компиляторы это охотно делают. Если компилятор видит цикл, в котором считается значение переменной, которая после этого не используется — он уберёт этот цикл из программы. И так далее.
Точнее даже сказать, что как правило он ни о том, ни о другом даже понятия не имеет, потому что это все — внешние вызовы.
#include <string.h>
#include <stdlib.h>
int main(void)
{
size_t n = 1000;
int *a = (int*)calloc(n,sizeof(int));
int *b = (int*)malloc(n*sizeof(int));
if (a && b)
memcpy(b,a,sizeof(int)*n);
return 0;
}
int main(void)
{
return 0;
}
main: # @main
xorl %eax, %eax
retq
void PFMAlloc() {
malloc(100);
}
PFMAlloc(): # @PFMAlloc()
retq
Это как раз удобно всяким .NET- и Java-программистам, не желающим следить за памятью.
vladon@vldn-dev:~/projects/temp$ clang++ -O3 -std=c++11 test.cpp -o test
vladon@vldn-dev:~/projects/temp$ ./test
Time=0
Если вы хотите стать приверженцем развращающей демократии C++, то туда вам и дорога, вы вправе сделать этот выбор. Но если вы готовы постичь нирвану в программировании, сохранить свои нервы, здоровье и здравомыслие, то ваш выбор ‒ C#.
Сравнительный анализ языков C# и C++