#!/usr/bin/perl
$_=q; ;;$=/=2;$\=qq;\012;;$_=$_ x($=);$/=\24;$q=qq;$_*;;$::__=
sub{print $q};sub xm{$::__->();}sub me{map{xm,$q=~s= \*=\* \*=}
($+..$=/2);$q} sub ye{$=--;$_='*'x --$=;$_.=q; *** ;,tr;* ; *;;$q=$_;}
sub gm{s;(?<=\w\w)\w+;;g;s;n;nd;g;eval;} sub nde{xm} sub ha{xm} $_=q;
merry xmas and happy new year
;;gm;
TSC(time stamp counter) is a register incremented every cpu tick (1/CPU_HZ) and it's read by the RDTSC instruction. The CPUID instructions clear out the pipeline and avoid any parallelism.
#define GETCC(_ll_) \
asm volatile("cpuid" : : : "eax", "ebx", "ecx", "edx"); \
asm volatile("rdtsc" : "=A"(_ll_)); \
asm volatile("cpuid" : : : "eax", "ebx", "ecx", "edx");
Sample
unsigned long long cc1, cc2, elapsed; GETCC(cc1); /*... do something ...*/ GETCC(cc2); elapsed = (cc2 - cc1);
#define REDUCE_XMMS(_r_, _tmp_) \
asm volatile(\
"movhlps %[r], %"_tmp_" \n\t"\
"addps %"_tmp_", %[r] \n\t"\
"movaps %[r], %"_tmp_" \n\t"\
"shufps $1, %[r], %"_tmp_" \n\t"\
"addss %"_tmp_", %[r] \n\t"\
: [r] "+x" (_r_) : : _tmp_);
Tested both on Win32 and Linux (beware of firewalls!)
import socket
import struct
import sys
port = 6543
address = "239.100.100.12"
if sys.argv[1] == 'server':
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
except AttributeError:
pass # Some systems don't support SO_REUSEPORT
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 255)
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
sock.bind(('0.0.0.0', port))
intf = socket.gethostbyname(socket.gethostname())
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF,
socket.inet_aton(intf) + socket.inet_aton('0.0.0.0'));
sock.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP,
socket.inet_aton(address) + socket.inet_aton('0.0.0.0'));
while True:
data = sock.recvfrom(1024)
print data
else:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 255)
sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
sock.sendto(sys.argv[2], (address, port))